[Flex]实现Application未初始化前加载自定义配置内容
有一定开发经验的程序员都习惯把一些可配置的信息内容存放在自定义的配置文件中,当需要改变配置时,只需要修改配置文件即可,不需要重新编译发布程序。
正常情况下,在Flex中读取自定义配置文件不是什么难事,但有时候要求在Application初始化之前必须获得完整配置信息,这样的话必须下一点功夫了。
Application初始化之前能够操作的地方就只有preloader了,如果把读取自定义配置文件跟preloader下载类库看作相同处理的话,基本就能达到功能。
注意:preloader只能使用flash和部分mx命名空间的类库,千万别使用mx和spark控件类库,否则preloader的工作就不是预加载了。
自定义配置信息类:
public class Config {public static const URL:String = "config.xml";private static var _instance:Config;public static function getInstance():Config{if (_instance == null)_instance = new Config();return _instance;}private var _config:XML;public function get config():XML{return _config;}public function set config(value:XML):void{_config = value;} }
加载自定义配置文件就在preloader把所有类库下载完毕,application初始化之前进行,于是这里拦截preloader的PRELOADER_DOC_FRAME_READY事件
public class SparkPreloader extends SparkDownloadProgressBar {private var _preloader:Sprite; private var suspend:Boolean;private var _urlLoader:URLLoader;public function SparkPreloader(){super();}override public function set preloader(value:Sprite):void{_preloader = value;super.preloader = value;value.addEventListener(FlexEvent.PRELOADER_DOC_FRAME_READY, preloaderDocFrameReadyHandler, false, int.MAX_VALUE); //添加最高级别监听}private function preloaderDocFrameReadyHandler(event:FlexEvent):void{//停止初始化Applicationevent.stopImmediatePropagation();if (suspend)return;suspend = true; //挂起startConfiguation(); //启动配置}private function startConfiguation():void{_urlLoader = new URLLoader();_urlLoader.addEventListener(Event.COMPLETE, completeHandler);_urlLoader.load(new URLRequest(Config.URL));}private function completeHandler(e:Event):void{_urlLoader.removeEventListener(Event.COMPLETE, completeHandler);Config.config = new XML(_urlLoader.data);_urlLoader = null;_preloader.removeEventListener(FlexEvent.PRELOADER_DOC_FRAME_READY, preloaderDocFrameReadyHandler); //移除监听_preloader.dispatchEvent(new FlexEvent(FlexEvent.PRELOADER_DOC_FRAME_READY)); //继续初始化Application}}
Flex的启动过程参考《浅析Flex启动过程》
简单说就是Flex归根结底还是swf,跟flash一样有时间轴和帧,只是Flex通常情况下只有两帧,第一帧是preloader,第二帧才是application。平时我们看到的loading界面就是第一帧的preloader,当下载完成后跳转到第二帧初始化application,并派发出PRELOADER_DOC_FRAME_READY事件。为了能在application初始化前读取配置内容,必须监听PRELOADER_DOC_FRAME_READY事件,并且必须是最高级别的监听,因为SystemManager中就是监听到PRELOADER_DOC_FRAME_READY事件后执行第二帧的初始化工作,而且SystemManager我们很难修改。代码中我借用了我《Flex中实现模块顺序执行》文中方法,如果有多个配置需要读取,或者还有其他初始化工作,则在通过addChild添加。因为PRELOADER_DOC_FRAME_READY事件是不断派发出来的,故我加上suspend标识防止重复处理,直到配置读取完成后,移除监听器并主动派发PRELOADER_DOC_FRAME_READY事件事件,让SystemManager继续工作。
经测试,再也没有报错了。我觉得这应该是最完美的解决方案了。
转载于:https://www.cnblogs.com/litou/archive/2011/10/28/2227873.html
[Flex]实现Application未初始化前加载自定义配置内容相关推荐
- inputstream 初始化_MyBatis初始化之加载初始化
在MyBatis初始化过程中,大致会有以下几个步骤: 1. 创建Configuration全局配置对象,会往TypeAliasRegistry别名注册中心添加Mybatis需要用到的相关类,并设置默认 ...
- java 初始化的加载顺序问题
总结一下java里面关于初始化的加载顺序问题: 考虑有一个基类和一个子类的情况 那么,当实例化一个子类的对象或者访问子类的静态域或静态方法时,会进行类的加载. 1)完成基类的static域和stati ...
- GMap.NET入门详细教程【2】-------- 初始化并加载一张地图
GMap.NET入门 下载 GMap.NET,并在VS中添加GMap.NET控件 初始化并加载一张地图 添加标记点.线.多边形 为控件添加事件,在鼠标单击时打点 初始化 双击地图控件,编辑cs代码中的 ...
- cad2006激活未找到html文件,解决cad提示“cad加载自定义文件失败 未找到acad”的方法...
下图所示的提示界面大家是不是觉得很熟悉呢?这个错误提示是出现在autocad程序中的错误之一.相比无法安装等情况这个故障的解决方法比较简单,首先我们来看看具体故障:有用户在双击打开Autocad的时候 ...
- VERSAL ACAP的加载与配置
1.缩略语 MIO : multiplexed I/O PMC : platform management controller TRM : technical reference manual AC ...
- Spring 3.1 –从数据库加载XML配置的属性
Spring使通过其PropertyPlaceholderConfigurer和(Spring 3.1之前)PropertySourcesPlaceholderConfigurer(Spring 3. ...
- Apollo配置中心热加载mysql_Apollo配置中心介绍
1.What is Apollo 1.1 背景 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关.参数的配置.服务器的地址-- 对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分 ...
- spring boot:从零开始搭建一个项目 - day 7 springboot devtools热加载+MybatisPlus配置+kisso从入门到放弃
spring boot:从零开始搭建一个项目 - day 7 springboot devtools热加载+MybatisPlus配置+kisso从入门到放弃 一.springboot devtool ...
- php定义一个名为Vehicles,[PHP][Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]...
Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如 ...
- Spark加载hadoop配置原理
0x0 背景 最近为了将hadoop&hive的五大配置文件,即: core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml hive ...
最新文章
- [20180412]订阅+镜像切换
- HDU 1848 Fibonacci again and again
- 大量POI点展示的一种解决方案
- Gym 100431E	Word Cover 题解:KMP上跑dp
- 22. Leetcode 237. 删除链表中的节点 (链表-基础操作类-删除链表的节点)
- 实战ELK(5) Logstash 入门
- 【文文殿下】网络流学习笔记
- Python学习笔记:函数(Function)
- 九度笔记之 1209最小邮票数
- 大众1.4t可以一直加92号汽油吗?有哪些需要注意的问题?
- python之函数用法__getitem__()
- Cannot assign to read only property 'exports' of object '#Object'
- 钉钉扫码登录第三方_e签宝联合钉钉升级产品功能,共建企业服务生态闭环
- WPF 引用 ttf文件
- bex5 mysql_bex5 库存系统的增删改查等功能对MYSQL数据库的维护操作 Windows Develop 276万源代码下载- www.pudn.com...
- 【原创】EXCEL数组公式(1)----数组公式和普通公式计算具体比较
- 基于Vue使用Arco Design组件封装一个七牛云上传图片的函数
- Python基础-映射
- LVS 的 Tunneling 模式
- Krpano 热点箭头动画