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的验证以及创建过程包括: