zoukankan      html  css  js  c++  java
  • 获取Flex SDK加载进度的方法

            用flex做的项目往往会把sdk设为RSL(运行时共享库)的方式加载,因为这样可以减小文件体积,缩短加载的时间。
    但是会碰到另外一个问题,加载SDK需要很长时间,并且flex没有提供sdk加载进度的方法。这样就会造成程序写加载
    进度条的时候不能把加载SDK的进度也算进去,造成加载进度不准确,程序已经加载完了,但是还需要等待sdk加载完
    才能进入主界面,会导致部分用户流失。
     
            由于这个问题对项目影响较大,所以必须找到解决办法。于是这段时间我对这个问题做了深入的研究。
     
            其实也不算怎么深入了,就是对flex开始loading到初始化的这段过程分析下。
     
            有一个不争的事实我们必须知道,下面是Adobe帮助文档的原话:
    SystemManager 是在应用程序中创建的第一个显示类。它负责创建要显示的 mx.preloaders.Preloader 以及应用程序完成加载时显示的 mx.preloaders.SparkDownloadProgressBar,然后创建 mx.core.Application 实例。
     
            所以我们必须从SystemManager入手,还好flex是开源的,提供SystemManager的源码。
     
    打开SystemManager类:
    构造函数里我们可以发现root.loaderInfo.addEventListener(Event.INIT, initHandler);说明监听了loaderInfo的init事件;
    initHandler里面我们可以找到initialize();说明在这里进行了初始化;
    initialize里面我们可以找到preloader = new Preloader();,说明开始创建Preloader对象,终于知道Preloader在哪初始化了。
    打开Preloader类:
    可以找到mx_internal function rslProgressHandler(event:ProgressEvent):voidmx_internal function rslCompleteHandler(event:Event):void
    这两个就是RSL的progress和complete事件,然后我们发现这两个函数里面都有dispatchEvent(rslEvent); 这句话。说明这两个事件是可以被Preloader
    的实例接收到的,这样的话,我们只要找到了preloader的实例就可以监听到RSL的加载进度和加载完成事件了。
    回到SystemManager类:
    我们已经知道preloader在哪初始化了,下面只要在Loader的时候能访问到preloader就大功告成了。
    initialize里面我们可以找到_popUpChildren.addChild(preloader);,说明在popUpChildren里面可以找到preloader。
    我们知道SystemManager有popUpChildren的get方法。说明popUpChildren是可以获取到的,这样我们顺藤摸瓜已经找到解决办法了。
     
    最后在加上一句SystemManager怎么获取呢?  很简单当swf被Loader加载的时候,Loader的content属性就是个SystemManager对象。
     
    下面附上我写的一段代码,以备需要的时候直接过来取:
                var loaderA:Loader;
                loaderA.load(new URLRequest("A.swf"), null);
                
                loaderA.contentLoaderInfo.addEventListener(Event.INIT, onInit);
                loaderA.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfLoaded);
                
                function onInit(e:Event):void{
                    loaderA.contentLoaderInfo.removeEventListener(Event.INIT, onInit);
                    loaderA.content.addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
                
                function onEnterFrame(e:Event):void{
                    if(loaderA.content["popUpChildren"]["numChildren"]>=1){
                        var preloader:Object = loaderA.content["popUpChildren"]["getChildAt"](0);
                        loaderA.content.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
                        
                        preloader.addEventListener("rslProgress",onLoadingAndLoaded);
                        preloader.addEventListener("rslComplete",onLoadingAndLoaded);
                    }
                }
                
                function onLoadingAndLoaded(e:Event):void{
                    var per:Number = e["bytesLoaded"]/e["bytesTotal"];
                    var per2:Number = e["rslIndex"]/e["rslTotal"];
                    
                    var percent:Number = per/e["rslTotal"]+per2;
                    trace(percent);
                }
     
    完!
  • 相关阅读:
    小波变换的引入,通俗易懂
    Leetcode 437. Path Sum III
    Leetcode 113. Path Sum II
    Leetcode 112 Path Sum
    Leetcode 520 Detect Capital
    Leetcode 443 String Compression
    Leetcode 38 Count and Say
    python中的生成器(generator)总结
    python的random模块及加权随机算法的python实现
    leetcode 24. Swap Nodes in Pairs(链表)
  • 原文地址:https://www.cnblogs.com/huomiao/p/2811368.html
Copyright © 2011-2022 走看看