获取Flex SDK加载进度的方法
生活随笔
收集整理的這篇文章主要介紹了
获取Flex SDK加载进度的方法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
用flex做的項(xiàng)目往往會(huì)把sdk設(shè)為RSL(運(yùn)行時(shí)共享庫(kù))的方式加載,因?yàn)檫@樣可以減小文件體積,縮短加載的時(shí)間。 但是會(huì)碰到另外一個(gè)問(wèn)題,加載SDK需要很長(zhǎng)時(shí)間,并且flex沒(méi)有提供sdk加載進(jìn)度的方法。這樣就會(huì)造成程序?qū)懠虞d 進(jìn)度條的時(shí)候不能把加載SDK的進(jìn)度也算進(jìn)去,造成加載進(jìn)度不準(zhǔn)確,程序已經(jīng)加載完了,但是還需要等待sdk加載完 才能進(jìn)入主界面,會(huì)導(dǎo)致部分用戶(hù)流失。 由于這個(gè)問(wèn)題對(duì)項(xiàng)目影響較大,所以必須找到解決辦法。于是這段時(shí)間我對(duì)這個(gè)問(wèn)題做了深入的研究。 其實(shí)也不算怎么深入了,就是對(duì)flex開(kāi)始loading到初始化的這段過(guò)程分析下。 有一個(gè)不爭(zhēng)的事實(shí)我們必須知道,下面是Adobe幫助文檔的原話: “SystemManager 是在應(yīng)用程序中創(chuàng)建的第一個(gè)顯示類(lèi)。它負(fù)責(zé)創(chuàng)建要顯示的 mx.preloaders.Preloader 以及應(yīng)用程序完成加載時(shí)顯示的 mx.preloaders.SparkDownloadProgressBar,然后創(chuàng)建 mx.core.Application 實(shí)例。” 所以我們必須從SystemManager入手,還好flex是開(kāi)源的,提供SystemManager的源碼。 打開(kāi)SystemManager類(lèi): 在構(gòu)造函數(shù)里我們可以發(fā)現(xiàn)root.loaderInfo.addEventListener(Event.INIT, initHandler);,說(shuō)明監(jiān)聽(tīng)了loaderInfo的init事件; 在initHandler里面我們可以找到initialize();,說(shuō)明在這里進(jìn)行了初始化; 在initialize里面我們可以找到preloader = new Preloader();,說(shuō)明開(kāi)始創(chuàng)建Preloader對(duì)象,終于知道Preloader在哪初始化了。 打開(kāi)Preloader類(lèi): 可以找到mx_internal function rslProgressHandler(event:ProgressEvent):void和mx_internal function rslCompleteHandler(event:Event):void 這兩個(gè)就是RSL的progress和complete事件,然后我們發(fā)現(xiàn)這兩個(gè)函數(shù)里面都有dispatchEvent(rslEvent); 這句話。說(shuō)明這兩個(gè)事件是可以被Preloader 的實(shí)例接收到的,這樣的話,我們只要找到了preloader的實(shí)例就可以監(jiān)聽(tīng)到RSL的加載進(jìn)度和加載完成事件了。 回到SystemManager類(lèi): 我們已經(jīng)知道preloader在哪初始化了,下面只要在Loader的時(shí)候能訪問(wèn)到preloader就大功告成了。 在initialize里面我們可以找到_popUpChildren.addChild(preloader);,說(shuō)明在popUpChildren里面可以找到preloader。 我們知道SystemManager有popUpChildren的get方法。說(shuō)明popUpChildren是可以獲取到的,這樣我們順藤摸瓜已經(jīng)找到解決辦法了。 最后在加上一句SystemManager怎么獲取呢?? 很簡(jiǎn)單當(dāng)swf被Loader加載的時(shí)候,Loader的content屬性就是個(gè)SystemManager對(duì)象。 下面附上我寫(xiě)的一段代碼,以備需要的時(shí)候直接過(guò)來(lái)取: ????????????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); ????????????} 完!
轉(zhuǎn)載于:https://www.cnblogs.com/huomiao/archive/2012/12/10/2811368.html
總結(jié)
以上是生活随笔為你收集整理的获取Flex SDK加载进度的方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用flot绘图出现window.G_v
- 下一篇: centos安装--两张光盘