多线程worker,AIR桌面版, HelloWorld(转)

关于多线程的例子和教程各位大侠已经发过很多了。但是大多数都是针对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改写的
很简单很短

下面我直接上第三种的项目文件,两个第三方类库也包含在其中了。

 

备注:本文纯属个人理解,如果有什么地方阐述的不对,还请各位大侠指出。谢谢~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值