关于多线程的例子和教程各位大侠已经发过很多了。但是大多数都是针对fp而言的。
但是针对air,多线程的实现方式就麻烦一些了。
这里要大体阐述下多线程的机制,as3中的多线程创建方式有些猎奇,他是根据包含多线程的swf文件的字节流创建的。这也就是为什么在web项目中,可以通过WorkerDomain.current.createWorker(this.loaderInfo.bytes);来创建一个worker。其意义就是通过自身的字节流this.loaderInfo.bytes来创建。
但是我们在air的桌面项目中,用此方法就行不通了,因为air中的loaderInfo.bytes并不是那个线程的swf的字节流(或许是格式不对或许是包含的东西不一样,我的个人理解,反正与单纯web版出来的东西是不一样的)
所以在air中只有如下三种方式可以创建多线程。
第一二中方法在如今的fb4.6里相对繁琐一些。等到下周的fb4.7beta出来以后将会方便很多。
(一)通过swf文件,用[Embed]来引入
如:
// Embed the SWF file
[Embed(source="../swfs/BgWorker.swf", mimeType="application/octet-stream")]
private static var BgWorker_ByteClass:Class;
private function createWorker():void
{
// create the background worker
var workerBytes:ByteArray = new BgWorker_ByteClass();
var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes);
// listen for worker state changes to know when the worker is running
bgWorker.addEventListener(Event.WORKER_STATE, workerStateHandler);
// set up communication between workers using
// setSharedProperty(), createMessageChannel(), etc.
// ... (not shown)
bgWorker.start();
}
在我之前的文章 中已有关于这个方法的例子
(二)通过swf文件,用URLLoader 来引入
如:
// load the SWF file
var workerLoader:URLLoader = new URLLoader();
workerLoader.dataFormat = URLLoaderDataFormat.BINARY;
workerLoader.addEventListener(Event.COMPLETE, loadComplete);
workerLoader.load(new URLRequest("BgWorker.swf"));
private function loadComplete(event:Event):void
{
// create the background worker
var workerBytes:ByteArray = event.target.data as ByteArray;
var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes);
// listen for worker state changes to know when the worker is running
bgWorker.addEventListener(Event.WORKER_STATE, workerStateHandler);
// set up communication between workers using
// setSharedProperty(), createMessageChannel(), etc.
// ... (not shown)
bgWorker.start();
}
(三)通过第三方类库,通过一个类来得到一个worker
需要用到两个第三方类库,分别是:
https://github.com/bortsen/worker-from-class
https://github.com/claus/as3swf
具体思路是,通过一个写有子线程的类 来获得其生成为swf文件的ByteArray。这样就得到了swf的字节流。
代码是根据http://esdot.ca/examples/HelloWorldWorker.as改写的
很简单很短
下面我直接上第三种的项目文件,两个第三方类库也包含在其中了。
备注:本文纯属个人理解,如果有什么地方阐述的不对,还请各位大侠指出。谢谢~