Flex Preloader

preloader 是在SystemManger的第一帧上面,其加入的时机是在initialize()中加入的。

调用是 constructor->initHandler(这里因为需要读取主swf对象自身的属性,所以在发出Event.INIT事件之后才能进行属性读取以及相关的操作,这些操作包括侦听帧的状态以便加载一些额外的内容)->initialize(),进入到这个方法的时候,flex开始建立一个用于rsl,resource,本身的预加载器,这个加载器旨在提供友好的用户提示,表示应用完成构造需要一定的时间.

preloader 必然是位于当前的所有管理器的最顶端,因为App没有加载完毕之后应该是不可见的,尽管其确实没有完成创建也不可见。

在这里,通过读取来自根swf的一些参数信息(由外部传入,猜测应该是有编译器传入的参数)控制一些样式信息,比如backgroundColor backgroundSize backgroundImage 等,还有就是rsl以及resource的资源链接地址以及相关信息参数,需要一并传递给preloader,这里采用preloader.initialize(..params)来初始化相关的数据,默认是需要传入确实是否使用一个提示加载器的,并且需要把这个提示加载器的类名字给传递过去,这个也是由外部传入的参数,这个参数可以通过MXML里面的Application标签中的 preloader=”sss.ss.ss” 来传递一个自己定义的提示加载器,注意这个提示加载器是我取的名字,实际是一个(downloaderProgressBar,默认的位于preloaders/下面,有两个默认的可供使用)反正作用就是一个加载的提示,这个要自定义需要实现特定的接口,而且和这里的preloader不是一个概念,为什么呢?

因为preloader是必须的,它需要完成自身的一些东西的载入,它是在后台运行的一个必须的过程,而提示器则是可有可无,没有,preloader照样要加载,因为主swf本身需要用到其加载的某些过程事件,rsl以及resource可能也许要,尤其是rsl,如果使用了共享链接库,则必须要加载,而downloaderprogressBar 则不是必需品,它只是外在的UI提示界面,告诉用户,我这个程序正在加载一些我自己要的东西,如果应用比较大,那么这样做体验就好些。默认使用的是SparkDownloaderProgressBar(flex4以后的版本)这个与使用的主题有关,以前是DownloaderProgressBar。

那么preloader是如何完成的呢,它有几个阶段,初始化阶段就是初始化所有的属性,如果要启用downloaderprogressbar,则会根据displayClass 创建一个progressbar ,并且开始加载数据,同时注册一个timer,当作一个加载的监听器,不断的测试加载的进程,这将主要做如下的事情:

如果frameloaded 到2表示可以进行application的构造工作了,发出  FlexEvent.PRELOADER_DOC_FRAME_READY

如果每次加载数据已满(bytesloaded和bytestotal 实际是自身加上rsl库的大小以及resource的大小,只是并不一定确定,因为这里rslloader不但是rsl的,而且是resource的加载器,),需要检测rsl是否加载完毕,完毕了就需要检查resource是否都已经加载完毕了,如果加载完毕了则开始派发Event.COMPLETE ,此事件实际给downloaderProgressBar使用,以帮助其确定这里所有的数据都加载完毕(默认没有用到,不过预留了监听器),当然这里并不代表整个初始化就真完了,也只是数据完毕了,后面还需要看Application的创建,所以这个时候其还会派发一个FlexEvent.INIT_PROGRESS事件,提示初始化仍在进行中。

这个时候就有Flex注册Application给preloader,通过registerApplication(app:Application)方法(这个注册是在Application构造完成时注册的,而且由flex自己完成,无法自己控制),注册的过程实际就是监听Application的验证以及创建过程包括:

app.addEventListener(“validatePropertiesComplete”, appProgressHandler);
app.addEventListener(“validateSizeComplete”, appProgressHandler);
app.addEventListener(“validateDisplayListComplete”, appProgressHandler);
app.addEventListener(FlexEvent.CREATION_COMPLETE, appCreationCompleteHandler);
最后根据Application完成自身的所有创建,更新显示列表之后,派发出CREATION_COMPLETE ,这里监听之后再次派发一个INIT_COMPLETE事件,表示初始化完成,在这里还不算完,因为这里也仅仅代表Application可用,创建完成,莫要忘记了如果使用的downloaderProgressBar,这个东西有没有完成还不知道,所以这个时候需要监听其Event.COMPLETE事件(如果没有启用,将直接调用收尾函数完成一些清理工作),一旦它完成了则最后收尾,取消掉不用的监听器,并且可能的话某些不要的对象设置为null,以便于垃圾回收器工作,并且派发出
FlexEvent.PRELOADER_DONE
自此,也就完毕了,而从preloader派发的这些事件都被SystemManger来使用,这里没有提到的一些rslevent,则是在rsl加载过程中派发出来的,在SystemManager需要用到,来判断rsl的载入情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值