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月前
|
芯片
如何使用中断的优先级
如何使用中断的优先级
49 1
|
存储 算法 Java
线程池最佳线程数量到底要如何配置?
线程池最佳线程数量到底要如何配置?
线程池最佳线程数量到底要如何配置?
|
4月前
线程的优先级
线程的优先级
|
iOS开发
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
434 0
|
6月前
|
Java
线程数设置
线程数设置
68 0
|
安全 算法 Java
【基础篇】7 # 队列:队列在线程池等有限资源池中的应用
【基础篇】7 # 队列:队列在线程池等有限资源池中的应用
123 0
【基础篇】7 # 队列:队列在线程池等有限资源池中的应用
|
C++
队列类(C++)
构造函数:初始化队列:将初始尺寸保存到 size,将队首 front 和队尾 rear 均置为 0,为动态数组分配内存并将起始地址保存到 element。Dequeue 函数:若队列不空,则从队列中取出元素并保存到 value中,函数值为 true;size 为动态数组的尺寸,front 为队首元素的下标,rear 为队尾元素下一位置的下标,element 为动态数组的起始地址。Clear 函数:清空队列,将 front 和 rear 重置为 0,操作成功,函数值为 true。首先定义数据元素类型。
145 0
|
算法 Unix Linux
进程的优先级
进程的优先级
106 0