[Flex]AIR APIs详解 - 文件访问系统 part6

连载索引:
AIR APIs详解 – 文件访问系统 part1
AIR APIs详解 – 文件访问系统 part2
AIR APIs详解 – 文件访问系统 part3
AIR APIs详解 – 文件访问系统 part4
AIR APIs详解 – 文件访问系统 part5
Part6:
是 时候讨论一下同步和异步的问题了。同步(synchronous)和异步(asynchronous)编程不单单是AIR开发中才会遇到的问题,而是所有 编程中都很重要的一部分。往通俗了说,同步已经可以解决很多问题,但是同步解决不了特定环境下的问题。而异步处理用好了就是幸福,用不好就是灾难。单纯的 从功能角度而言,只要逻辑执行效率够高,速度够快(我们期待的快),很多问题用同步就可以解决,比如文件的操作。但是事实不是这样,我们AIR APIs连载的前五篇中的范例,全部是同步操作,这是基于这些范例的操作逻辑足够简单,操作的目标对象被处理的速度非常快,对于使用Flex(Flash Player单线程机制)而言,处于文件(夹)操作之后的逻辑完全可以等待这些小型的文件操作完成再顺序执行,这就是同步,后面的操作要等前面的逻辑执行 完毕后才会执行。但是如果我们操作的是一个1GB或者更大的文件目录体系呢?用同步的方式,后面的逻辑都要等这个操作完成,才能开始执行,显然这个不是同 步可以解决的问题。这时候需要在AIR里引入异步处理,很高兴,Adobe在AIR的很多APIs操作中都有内置的异步方式支持。
异步操作的最大 特点是没有必要非要在一个逻辑执行完毕后才去执行后续的逻辑,这个逻辑初次听起来还有点困惑,但是AIR中异步的实用价值在于当一个操作花费很长时间的时 候,后面的其他逻辑没必要等待,比如大文件夹的浏览和操作,大数据量文件的读写。不仅仅在AIR中,连平时Flash操作XML文件都可能要根据网络速度 和XML数据的大小来决定是否正确的使用异步操作。我们现在就来看一个异步执行语句逻辑的AS范例(你可以贴在Fla文件的timeline的第一帧上执 行,确认你的sandbox在publish setting是local file access only):

//命名一个URLLoader对象
var myloader:URLLoader;
myloader=new URLLoader();
myloader.addEventListener(Event.COMPLETE,completeLoadingHandler);
//从我的站点可以下载rss.xml,就在首页部分右下角的xml logo上,将rss.xml存储到与swf同一目录
myloader.load(new URLRequest("rss.xml"));
trace(myloader.data);
private function completeLoadingHandler(event:Event):void{
  trace(myloader.data);
}

上 面的代码你在执行后,会发现第一个trace语句的执行永远都是在myloader.load之前,而且是undefined,而真正有load数据的则 是completeLoadingHandler里面的trace部分,这就说明URLLoader类的load()方法本身就是异步的,所以,第一个 trace语句会先于load执行,所以结果是undefined。
那么使用同步和异步的规则很简单,当逻辑执行可以非常快的完成时,你就可以使用同步操作的方式了。而在AIR的文件访问API中,很多文件类的操作方法兼具同步和异步两个,具体使用哪个,可以根据情况而定,而今后的连载,你也将会看到有异步方法的操作了。
好了,part6就到这里。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏