Flex框架:RSL和主程序(swf)是并行下载的吗?
用下面的代码来验证:
自定义进度条,重写全部六个加载过程的监听函数,再重写的每个函数中把信息写入变量中,然后看变量的内容来确定各个监听函数的调用顺序:
ProgressEvent.PROGRESS, progressHandler);
Event.COMPLETE, completeHandler);
RSLEvent.RSL_PROGRESS, rslProgressHandler);
RSLEvent.RSL_COMPLETE, rslCompleteHandler);
RSLEvent.RSL_ERROR, rslErrorHandler);
FlexEvent.INIT_PROGRESS, initProgressHandler);
FlexEvent.INIT_COMPLETE, initCompleteHandler);
>>源代码如下:
Main.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
preloader="Preloader"
minWidth="955" minHeight="600">
</s:Application>
Preloader.as
package
{
import flash.events.Event;
import flash.events.ProgressEvent;
import mx.events.RSLEvent;
import mx.preloaders.SparkDownloadProgressBar;
public class Preloader extends SparkDownloadProgressBar
{
private var txt:String = "";
public function Preloader()
{
super();
}
override protected function completeHandler(evt:Event):void
{
txt+="completeHandler"+"\n\t";
super.completeHandler(evt);
}
override protected function rslCompleteHandler(evt:RSLEvent):void
{
txt+="rslCompleteHandler"+"==" + evt.bytesLoaded + "==" + evt.bytesTotal + "\n\t";
super.rslCompleteHandler(evt);
} override protected function initCompleteHandler(evt:Event):void
{
txt+="initCompleteHandler"+"\n\t";
dispatchEvent(new Event(Event.COMPLETE)); //在此处打断点,通过Debug的形式来查看txt的值
}
override protected function progressHandler(evt:ProgressEvent):void {
txt+="PH"+"==" + evt.bytesLoaded + "==" + evt.bytesTotal + "\n\t";
super.progressHandler(evt);
}
override protected function rslProgressHandler(evt:RSLEvent):void {
txt+="rslPH"+"==" + evt.bytesLoaded + "==" + evt.bytesTotal + "\n\t";
super.rslProgressHandler(evt);
}
override protected function initProgressHandler(evt:Event):void {
txt+="initProgressHandler"+"\n\t";
super.initProgressHandler(evt);
}
}
}
>>通过Debug得到的结果如下(为查看方便,把连续的相同项做了删除)
可以得出如下结论:
(1)主程序(swf)一下子就下载完了,然后RSL才开始下载。 -->结果看起来虽然是这样,从源代码分析会是如何呢
(2)ProgressEvent.PROGRESS事件反映的是主程序(swf)和RSL合起来的进度信息,而并非只反映其中一项
(3)事件【Event.COMPLETE(全部下载完成后发出的事件)】的确如其定义的那样
txt的内容 | 分析结果 |
PH==21409850==21409850 | 21409850是主程序的大小,奇怪的是一下子就全部下载完了? |
rslPH==8192==312694 | 312694是某个RSL的大小,它通过若干次的最终下载完毕 |
rslPH==312694==312694 | |
PH==21722544==21722544 | 21722544是主程序(21409850)+已经下载完成的RSL(312694)的总和 |
rslCompleteHandler==312694==312694 | |
rslPH==8192==542900 | |
rslPH==542900==542900 | |
PH==22265444==22265444 | |
rslCompleteHandler==542900==542900 | |
rslPH==8192==528317 | |
rslPH==528317==528317 | |
PH==22793761==22793761 | |
rslCompleteHandler==528317==528317 | |
rslPH==8192==776202 | |
rslPH==776202==776202 | |
PH==23569963==23569963 | |
rslCompleteHandler==776202==776202 | |
rslPH==8192==69334 | |
rslPH==69334==69334 | |
PH==23639297==23639297 | |
rslCompleteHandler==69334==69334 | |
PH==23639297==23639297 | |
PH==23639297==23639297 | |
completeHandler | RSL和主程序(swf)源文件全部下载完毕后发出该事件 |
initProgressHandler | RSL和主程序(swf)源文件全部下载完毕后要初始化主程序(swf) |
initProgressHandler | |
initProgressHandler | |
initProgressHandler | |
initCompleteHandler | 主程序(swf)初始化完毕后发出该事件,移除进度条,显示主程序 |