网站权重查看,房产网站 模板,建设企业网站官网下载中心,好用的百度网盘搜索引擎用flex做的项目往往会把sdk设为RSL(运行时共享库)的方式加载#xff0c;因为这样可以减小文件体积#xff0c;缩短加载的时间。但是会碰到另外一个问题#xff0c;加载SDK需要很长时间#xff0c;并且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):void和mx_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); } 完转载于:https://www.cnblogs.com/huomiao/archive/2012/12/10/2811368.html