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

目录
相关文章
|
2月前
线程的优先级
线程的优先级
|
4月前
|
消息中间件 调度 数据安全/隐私保护
xenomai内核解析--任务同步互斥机制(一)--优先级倒置
本文是关于Xenomai实时操作系统中资源管理和优先级倒置问题的概述。Xenomai使用`xnobject`和`xnregistry`管理任务间的同步互斥资源,如信号量、互斥锁等。资源管理涉及访问控制和资源保存,确保共享资源的正确调度。文章还介绍了优先级倒置现象,即高优先级任务因低优先级任务持有资源而被阻塞。为解决此问题,Xenomai采用了优先级继承策略,临时提升低优先级任务的优先级,以防止持续的优先级反转。文章后续将深入分析`xnsynch`模块和优先级倒置解决方案。
119 1
xenomai内核解析--任务同步互斥机制(一)--优先级倒置
|
安全 算法 Java
【基础篇】7 # 队列:队列在线程池等有限资源池中的应用
【基础篇】7 # 队列:队列在线程池等有限资源池中的应用
116 0
【基础篇】7 # 队列:队列在线程池等有限资源池中的应用
|
算法 Unix Linux
进程的优先级
进程的优先级
99 0
|
存储
队列的定义与实现
前面一章讲了栈的定义与实现,我们一样可以通过限制线性表的一些基本操作来实现另一种常用的数据结构---队列,这一章简单来讲讲队列的定义与实现。
133 0
队列的定义与实现
|
算法
算法开启队列转栈武魂
算法开启队列转栈武魂
127 0
算法开启队列转栈武魂
|
算法
算法开启栈转队列武魂
算法开启栈转队列武魂
100 0
算法开启栈转队列武魂