2016-05-02 10 views
0

同じswfを使用しているFlexのワーカーに対してライフサイクルイベントがトリガされているとは思われません。私はswfデータの量を小さく保つ必要があるので、同じコードを使用するので、両方のスレッドで同じswfを使用したいと思います。ライフサイクルイベントがなければ、ワーカースレッドを初期化できません。私は作業者とデータを共有することができますが、初期化を行わなくても実際には役に立ちません。私は労働者のための別のクラスを作成しないようにしたいと思います。 のイベントがありますか?ワーカーは初期化に使用できますか?Flexシングルswfワーカー - ライフサイクルイベントやコンストラクタがない場合、ワーカーはどのように設定されていますか?

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" applicationDPI="160" preinitialize="preInitializeHandler(event)" 
       initialize="initializeHandler()" 
       creationComplete="creationCompleteHandler()" 
       applicationComplete="init()"> 
    <fx:Script> 
     <![CDATA[ 
      private function init():void 
      { trace("Application Complete"); 
       var swfBytes:ByteArray = this.loaderInfo.bytes; 
       if (Worker.current.isPrimordial) { 
        var bgWorker:Worker = WorkerDomain.current.createWorker(swfBytes); 
        bgWorker.addEventListener(Event.WORKER_STATE, workerHandler); 
        bgWorker.start(); 
       } 
      } 

      private function preInitializeHandler(event:Event):void{ 
       var p:Event=event; 
       trace("Pre Initialize"); 
      } 

      private function initializeHandler():void{ 
       trace("Initialize"); 
      } 

      private function creationCompleteHandler():void{ 
       trace("Creation Complete"); 
      } 

      private function workerHandler(event:Event):void{ 
       trace("Worker is running"); 
      } 

     ]]> 
    </fx:Script> 
</s:Application> 

出力:

[SWF] FlexMobileWorkerTest.swf - 3,697,251 bytes after decompression 
Pre Initialize 
Initialize 
Creation Complete 
Application Complete 
Worker is running 
[SWF] FlexMobileWorkerTest.swf - 3,697,251 bytes after decompression 
+0

何を初期化しますか?あなたのワーカーは既に稼働していますので、使用してください。 – BotMaster

+0

あなたは「あなたが使っている」という言葉を考える必要があります。これは、別のクラスではなく、単一のswfです。 AIRでは、単一のswfが動作します。これは、クラスコンストラクターがステートメントを追加できます(つまり、 'using it')。上記で作成された作業者は、オブジェクト構築ではなく、データを通信するメッセージのみを受け取ることができます。私はflexの単一のswf労働者について間違って考えているかもしれませんが、それ以外の方法はわかりません。 – Joe

+0

明らかに、私は、ワーカーが実行していることを伝えることができます。そうでなければ、イベントを表示するために「ワーカーが実行中です。上記の単一のswfを使用している点は、ワーカースレッドを設定するコードがあっても、Flexでは呼び出されず、コンストラクタのためにAIRアプリケーションで呼び出される点です。私はこの説明を反映するために元の質問を変更しました。 – Joe

答えて

1

残念ながら、これはこの構成では不可能です。

シングルSWF労働者がいる設定の典型的な例:

public class MadWorker extends Sprite 
{ 
    private var workerName:String = "AverageWorker"; 

    public function MadWorker() 
    { 
     super(); 
     init(); 
    } 

    private function init() 
    { 
     var swfBytes:ByteArray = this.loaderInfo.bytes; 
     if (Worker.current.isPrimordial) { 
      this.workerName = "PrimordialWorker"; 
      trace("Primordial worker setup"); 

      var bgWorker:Worker = WorkerDomain.current.createWorker(swfBytes); 
      bgWorker.addEventListener(Event.WORKER_STATE, workerHandler); 
      bgWorker.start(); 
     } else { 
      trace("Non-primordial worker setup"); 
      //Start long-running calculation 
     } 
    } 

    private function workerHandler(event:Event):void{ 
     trace("Worker is running: " + this.workerName); 
    } 
} 

init()はコンストラクタで呼ばれているという事実は非常に重要です。 Workerが作成されると、単にクラスのコンストラクタを呼び出します。これはActionscriptでクラスを定義する際には問題ありませんが、MXMLのshowstopperです(MXMLコンポーネントのコンストラクタを定義することはできません - 詳しくはdocsHow to make MXML Component Constructor with Arguments?を参照してください)。

残念ながら、メインクラスにはApplicationを拡張することはできません。あなたは "Error#1007:非コンストラクタに対してインスタンス化しようとしました。"というメッセージが表示されます。 This Jira issueに詳細があります。

+0

これは正解だと思いますが、もう一週間お話します。 – Joe

+0

このクレジットを正解として与えることは、Flexでは不可能です。 – Joe

0

たぶん、あなたは労働者が自分のクラスのちょうど別のインスタンスであり、同じイベントを発生すべきと思いますか?ワーカーはステージも表示リストもなく、文字通り単なるスレッドであり、ワーカーがディスパッチして受け取ること以外のイベントを生成したり受信したりすることはありません。

ワーカーを作成したら、必要なメッセージチャネルとプロパティを作成して双方向通信を確実に行うことができます。労働者は他の何もしません、私はあなたが何を、なぜ彼らがそれ以上のことをすることを期待しているのか分かりません。

+0

はい、同じクラスの別のインスタンスだと思います。元のバイトコードとまったく同じバイトコードを使用しています。しかし、元のアプリケーションが既にレンダリングされているため、イベントが発生するとは思われません。 – Joe

+0

Flexでは単一のスレッドswfを使用することはできませんが、コンストラクタのためにAIRでは可能ですか? FlexでオーバーライドするApplicationコンストラクタがある場合は、オブジェクトを作成するステートメントをワーカーに作成できます。上記のコードでは、init()が呼び出されないため、ワーカーがオブジェクトを作成しないため、通信が役に立たなくなります。 – Joe

+0

また、Flexで "Class Initialized"というイベントが発生した場合、そのイベントをトリガーできますが、そのままではメッセージを認識して動作するオブジェクトをWorkerに作成する方法はありません。 – Joe

関連する問題