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);
                }
     
    完!
  • 相关阅读:
    【设计模式】责任链模式
    python 获取cookie,发送请求
    python requests报错:Exception: ('Connection broken: IncompleteRead(3794 bytes read, 4398 more expect ed)', IncompleteRea
    获取二维数组 所有的组合排列
    tp3.0 验证码生成和使用
    MySQL: mysql is not running but lock exists 的解决方法
    [RxSwift]4.2.0、Observer
    [RxSwift]4.1.6、ControlEvent
    [RxSwift]4.1.5、Signal
    [RxSwift]4.1.4、Driver
  • 原文地址:https://www.cnblogs.com/huomiao/p/2811368.html
Copyright © 2011-2022 走看看