Flex 单个 swf worker - 没有生命周期事件或构造函数,worker 是如何配置的?

Flex single swf worker - with no lifecycle events or constructor, how is the worker configured?

我没有看到在 Flex 中使用相同 swf 的工作人员触发生命周期事件。我需要保持 swf 数据量小,所以我想对两个线程使用相同的 swf,因为它们使用相似的代码。没有生命周期事件,我无法初始化工作线程。我可以和 worker 共享数据,但是没有初始化,它真的没有用。我想避免为 Worker 创建一个单独的 class。 worker 中是否有任何事件可用于初始化?

<?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

也许您认为 worker 只是 class 的另一个实例,应该触发相同的事件?一个 worker 没有阶段,没有显示列表,它实际上只是一个线程,它永远不会生成或接收任何其他事件,而不仅仅是那些 Worker 打算派发和接收的事件。

创建工作人员后,您就可以创建必要的消息通道和属性以确保双向通信。工人不会做任何其他事情,我不确定您期望他们做的不仅仅是什么或为什么?

遗憾的是,在此配置中这是不可能的。

一个配置单SWF Worker的典型例子是:

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 时,它只是调用 class 的构造函数。当您在 Actionscript 中定义 class 时,这没有问题,但它是 MXML 中的一个障碍(您不能为 MXML 组件定义构造函数 - 请参阅 docs and How to make MXML Component Constructor with Arguments? 了解更多信息)。

不幸的是,您不能只为您的主要 class 扩展 Application;你会得到 "Error #1007: Instantiation attempted on a non-constructor." This Jira issue 有详细信息。