LoaderQueue:带优先级的加载队列

简介: LoaderQueue:带优先级的加载队列

在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

目录
相关文章
|
6月前
|
芯片
如何使用中断的优先级
如何使用中断的优先级
52 1
|
JavaScript 算法
v-if和v-for的优先级是什么?
v-if和v-for的优先级是什么?
121 0
|
4月前
线程的优先级
线程的优先级
|
6月前
|
消息中间件 调度 数据安全/隐私保护
xenomai内核解析--任务同步互斥机制(一)--优先级倒置
本文是关于Xenomai实时操作系统中资源管理和优先级倒置问题的概述。Xenomai使用`xnobject`和`xnregistry`管理任务间的同步互斥资源,如信号量、互斥锁等。资源管理涉及访问控制和资源保存,确保共享资源的正确调度。文章还介绍了优先级倒置现象,即高优先级任务因低优先级任务持有资源而被阻塞。为解决此问题,Xenomai采用了优先级继承策略,临时提升低优先级任务的优先级,以防止持续的优先级反转。文章后续将深入分析`xnsynch`模块和优先级倒置解决方案。
156 1
xenomai内核解析--任务同步互斥机制(一)--优先级倒置
|
6月前
|
网络协议
优先级总结
优先级总结
49 1
|
6月前
|
SQL 资源调度 分布式计算
Yarn【多队列实例、任务优先级设置】
Yarn【多队列实例、任务优先级设置】
|
安全 UED
如何思考需求的优先级?
如何思考需求的优先级?
93 0
|
JavaScript 前端开发
|
算法 Unix Linux
进程的优先级
进程的优先级
109 0