解析: Flex初始化时、加载进度监控的设计思路: (2)监控并行加载进度的定时器

原创 2012年03月29日 17:14:18

加载进度 = 已加载量 / 加载总量

 

因为是并行(多个Loader同时)加载,所以: 加载进度 = 各个Loader已加载量的总和 / 各个Loader加载总量之和

如何能一下子汇总全部Loader的“已加载量 / 加载总量”这两种数据呢?

假设有LoaderA、LoaderB 2个加载器,它们同时加载不同的swf资源。

在某个时点:

各个Loader已加载量的总和 = LoaderA.loaderInfo.bytesLoaded + LoaderB.loaderInfo.bytesLoaded

各个Loader加载总量之和     = LoaderA.loaderInfo.bytesTotal + LoaderB.loaderInfo.bytesTotal

于是该时点并行加载的进度可以计算出来了。

 

Flex框架通过设置定时器,来定时计算并行加载进度。

另外,RSL是顺序下载的(http://blog.csdn.net/tiangej/article/details/7353860),也就是说一个Loader加载完毕后,下一个Loader才开始下载,也就是说在上一个Loader没有加载完毕之前,下一个Loader中的bytesLoaded和bytesTotal的值都是0。

因此,“各个Loader加载总量之和”是不能在加载之初就能确定的,getByteValues()函数的每一次被调用,计算出的“各个Loader加载总量之和 ”都可能发生变化。

 

这也解释了如下现象:

Flex进度条的进度突然退后了。

 

>>源代码参考:

mx.preloaders.Preloader.as

    public function initialize(showDisplay:Boolean, 
                               displayClassName:Class,
                               backgroundColor:uint,
                               backgroundAlpha:Number,
                               backgroundImage:Object,
                               backgroundSize:String,
                               displayWidth:Number,
                               displayHeight:Number,
                               libs:Array = null,
                               sizes:Array = null,
                               rslList:Array = null,
                               resourceModuleURLs:Array = null,
                               applicationDomain:ApplicationDomain = null):void
    {
	......

        // 定时器    
        timer = new Timer(10);
        timer.addEventListener(TimerEvent.TIMER, timerHandler);
        timer.start();
        
	......
    }


 

    private function timerHandler(event:TimerEvent):void
    {
        // loaded swfs may not have root right away
        if (!root)
            return;
        //获得并行加载进度数据
        var bytes:Object = getByteValues();
        var loaded:int = bytes.loaded;
        var total:int = bytes.total;
        //将进度数据通过事件发送给事件监听器,以此来更新画面上显示的进度条状态
        // Dispatch a progress event (later we might conditionalize this
        // so that it isn't sent on a cache load).
        dispatchEvent(new ProgressEvent(ProgressEvent.PROGRESS,
                                        false, false, loaded, total));

        if (waitingToLoadResourceModules)
        {
            if (applicationDomain.hasDefinition("mx.resources::ResourceManager"))
            {
                waitingToLoadResourceModules = false;
                rslListLoader = resourceModuleListLoader;
                rslDone = false;
                // Start loading the resourceModules
                rslListLoader.load(rslProgressHandler,
                                   rslCompleteHandler,
                                   rslErrorHandler,
                                   rslErrorHandler,
                                   rslErrorHandler);
            }
        }



 

    private function getByteValues():Object
    {   //获取主swf的加载器,它由FlashPlayer提供
        var li:LoaderInfo = root.loaderInfo;
        var loaded:int = li.bytesLoaded;
        var total:int = li.bytesTotal;
        //循环多个RSL加载器,累加下载数据
        // Look up the rsl bytes and include those
        var n:int = rslListLoader ? rslListLoader.getItemCount() : 0;
        for (var i:int = 0; i < n; i++)
        {
            loaded += rslListLoader.getItem(i).loaded;

            // If the rsl total is zero then provide an average rsl size
            // to set rough expectations.
            var rslTotal:int = rslListLoader.getItem(i).total;
            total += rslTotal;
        }
        
        return { loaded: loaded, total: total };
    }

 

解析: Flex初始化时、加载进度监控的设计思路

先做些铺垫: 琢磨一下Flex初始化阶段,当加载swf自身以及RSL(资源模块同理)的时候,涉及到哪些关键角色(对象)以及它们的分工协作关系是怎样的? 关键类 存在理由 ...
  • tiangej
  • tiangej
  • 2012年03月28日 18:51
  • 1056

解析: Flex初始化时、加载进度监控的设计思路: (1)不同的Loader并行下载

ActionScript(Flex)的加载类是Loader。 我们先看一下其定义:   包 flash.display 类 public class Loade...
  • tiangej
  • tiangej
  • 2012年03月29日 15:20
  • 985

解析: Flex初始化时、加载进度监控的设计思路: (4)涉及到的角色和流程图

http://download.csdn.net/detail/tiangej/4187187
  • tiangej
  • tiangej
  • 2012年03月30日 16:25
  • 576

解析: Flex初始化时、加载进度监控的设计思路: (3)视图与逻辑的分离(提供自定义进度条的可能性)

在网络上搜索关键字: “Flex 自定义进度条” 会找到很多事例代码。   Flex框架通过将视图与逻辑分离设计,来提供一种可能性: 自定义进度条 视图:进度条外观 逻辑:加载以及加载监控 ...
  • tiangej
  • tiangej
  • 2012年03月29日 20:17
  • 1140

UIWebView 加载进度控件 NJKWebViewProgress的使用

UIWebView 加载进度控件 NJKWebViewProgress的使用
  • huxinguang_ios
  • huxinguang_ios
  • 2016年05月03日 15:19
  • 1020

Flex中用代码控制进度条的进度

用代码控制进度条的进度
  • erwin2012
  • erwin2012
  • 2017年06月13日 21:15
  • 222

js效果 图片加载进度实时显示

var l=0;var imgs;var sum=0;var imgs=new Array();function chk(){  l--;  document.getElementById("aa")...
  • Reasoncool
  • Reasoncool
  • 2007年10月29日 08:59
  • 1349

多种风格的图片加载进度条(Fresco、UIL、Glided多种风格加载)

好了,不说废话 首先,你必须先创建一个CircleProgress或者RectanglePropress或者其他 CircleProgress progress = n...
  • a358583166
  • a358583166
  • 2017年03月31日 16:52
  • 471

Android图片加载框架最全解析,实现带进度的Glide图片加载功能

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/78357251扩展目标首先来确立一下功能扩展的目标。虽说Glide本身就已经十分强大...
  • u010667468
  • u010667468
  • 2017年12月10日 22:14
  • 131

FLEX初始化事件执行顺序

原文链接:http://ianysoft.iteye.com/blog/1054960 Flex初始化事件执行顺序测试应用代码   "1.0" encoding="utf-8"...
  • liliiii
  • liliiii
  • 2015年10月14日 10:49
  • 469
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解析: Flex初始化时、加载进度监控的设计思路: (2)监控并行加载进度的定时器
举报原因:
原因补充:

(最多只允许输入30个字)