Skip to content

Instantly share code, notes, and snippets.

@lynxerzhang
Created September 6, 2012 14:30
Show Gist options
  • Save lynxerzhang/3656871 to your computer and use it in GitHub Desktop.
Save lynxerzhang/3656871 to your computer and use it in GitHub Desktop.
关于Worker和MessageChannel的使用注意事项
查阅Adobe文档发现ByteArray的shareable属性已经移入了下一版本的FlashPlayer中,也就是目前(11.4)即使设置了该属性,也无作用。
也就是通过MessageChannel发送出去的是副本, 而不是引用。
同时在新创建的Worker中获取主Worker(主swf文件的Worker)中该worker所设置的MessangeChannel时需要注意, 添加监听最好在最后阶段。
例如:
在主文件中,我们这样设置
worker = WorkerDomain.current.createWorker(Workers.HandleConcurrent, false);
mainToBack = Worker.current.createMessageChannel(worker);
backToMain = worker.createMessageChannel(Worker.current);
//我们设置了从主线程到副线程和副线程到主线程的通信所需要的MessangeChannel
worker.setSharedProperty("mainToBack", mainToBack);
worker.setSharedProperty("backToMain", backToMain);
在副线程中:
我们获取这些设置
mainToBack = Worker.current.getSharedProperty("mainToBack");
mainToBack.addEventListener(Event.CHANNEL_MESSAGE, mainToBackHandler);
backToMain = Worker.current.getSharedProperty("backToMain");
这样看似没有问题, 但是需要注意的如果主文件在开始副线程(调用worker.start())时,如果同时发送给副线程信息时(调用mainToBack.send()), 第三句代码将不在执行, 直到mainToBackHandler方法执行完毕, 才会获取backToMain的引用。
调用start方法后立即发送消息
worker.start();
mainToBack.send("work is coming");
这就造成了空对象的报错(如果在mainToBackHandler方法中使用backToMain)。所以稳妥的方法是把监听加在最后面
mainToBack = Worker.current.getSharedProperty("mainToBack");
backToMain = Worker.current.getSharedProperty("backToMain");
mainToBack.addEventListener(Event.CHANNEL_MESSAGE, mainToBackHandler);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment