在Flash项目中,我们一般都需要加载外部文件:共享库,XML,图片,音乐等等。在多数情况下,我们都希望能够控制这些加载的文件的先后顺序。如在Flash游戏中,我们希望用户先看到地图,然后是可视范围内的人物。有的时候,我们希望先加载XML,能暂停那些不重要的加载(地图缓存数据),先处理数据发送。
为了解决以上提到的功能需要,我和我的同事Austin一起着手写一个更好用的加载队列。我们暂时取名为:LoaderQueue。在一开始,我们就希望它能支持优先级,多进程和更易用。
OK,看看它有哪些特色:
1. 基于接口,方便扩展易于学习
LoaderQueue提供两个接口:ILoaderQueue用于定义对外的一致接口,主要负责添加和删除不同的ILoaderAdapter,该接口目前有唯一的实现:LoaderQueue。
ILoaderAdapter定义一个一致的接口用于实现不同类型文件的加载,目前内置的有Loader、URLLoader、Sound和URLStream也可以根据项目需要添加更多。
基本用法:
//实例化LoaderQueue,2进程, 延迟100毫秒
loaderQueue = new LoaderQueue(2, 100, true);
//添加一个图片加载
var pic1:LoaderAdapter =
new LoaderAdapter(1, new URLRequest("images/pic1.jpg"));
//添加一个图片加载
var pic2:LoaderAdapter =
new LoaderAdapter(1, new URLRequest("images/pic2.jpg"));
loaderQueue.addItem(pic1);
loaderQueue.addItem(pic2);
2. 优先级控制
从上图可以看出,LoaderQueue加载顺序是从优先级高的开始加载,在加载过程中,如果有优先级高的加载插入,会暂停优先级较低的加载,先加载高的对象。
3. 连接池
ILoaderQueue.threadLimit 属性用于控制同时可加载的对象数目。你可以在构造函数中指定,也可以在在加载过程中调整。
4. 缓存管理
如果一个文件已经加载过(缓存在浏览器中),事实上再次加载是不需要花费多少时间的,如果再次加入队列,它有可能需要排队(如果优先级低的话),这无形浪费了很多时间,用户体验也不好,此时,设置 loaderQueue.jumpQueueIfCached = true,可以开启该功能。该参数默认为true。
支持禁用缓存,设置LoaderAdptaer.preventCache = true;即可禁用缓存。
5. 支持对单个或多个文件加载进度及情况进行监控
LoaderQueue只提供单个文件是事件调度,当需要处理一批文件的加载进度时,我们需要使用LoaderProgress对象。示例如下:
//实例化LoaderQueue,2进程, 延迟100毫秒
loaderQueue = new LoaderQueue(2, 100, true);
//实例化一个LoaderProgress
var loaderProgress:LoaderProgress = new LoaderProgress();
//监听进度事件
loaderProgress.addEventListener(Event.CHANGE,
function(event:Event):void
{
trace(loaderProgress.totalProgress);
});
//添加一个图片加载
var pic1:LoaderAdapter =
new LoaderAdapter(1, new URLRequest("images/pic1.jpg"));
//添加一个图片加载
var pic2:LoaderAdapter =
new LoaderAdapter(1, new URLRequest("images/pic2.jpg"));
loaderProgress.addItem(pic1);
loaderQueue.addItem(pic1);
loaderProgress.addItem(pic2);
loaderQueue.addItem(pic2);
//开始对进度监听
loaderProgress.start();
//停止对进度监听
//loaderProgress.start();
6. 非索引式获取一个加载对象,而是直接获得加载对象实例
从上面的例子可以看到,创建一个ILoaderAdapter实例时,LoaderQueue并不保存对该实例获取的索引,因此,实例化ILoaderAdapter的对象必须自己保持ILoaderAdapter的指针。这样的好处是实例创建者才可以获得ILoaderAdapter实例,而不是任何对象都可以通过一个String名称就可以得到。
7.失败重连
maxTries参数可以设置当加载失败时重试次数,默认为3次。
该功能已经在一个社交网站中用到,效果很不错。我会增加这个工具。有兴趣的朋友可以看看。:)
源代码地址:https://github.com/wersling/LoaderQueue
DEMO:http://wersling.github.com/manaca/loaderqueue-demo/LoaderQueueDemo.html