获取Flex SDK加载进度的方法
生活随笔
收集整理的這篇文章主要介紹了
获取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
總結
以上是生活随笔為你收集整理的获取Flex SDK加载进度的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用flot绘图出现window.G_v
- 下一篇: centos安装--两张光盘