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 有详细信息。
我没有看到在 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 有详细信息。