获取Flex SDK加载进度的方法

用flex做的项目往往会把sdk设为RSL(运行时共享库)的方式加载,因为这样可以减小文件体积,缩短加载的时间。
但是会碰到另外一个问题,加载SDK需要很长时间,并且flex没有提供sdk加载进度的方法。这样就会造成程序写加载
进度条的时候不能把加载SDK的进度也算进去,造成加载进度不准确,程序已经加载完了,但是还需要等待sdk加载完
才能进入主界面,会导致部分用户流失。
由于这个问题对项目影响较大,所以必须找到解决办法。于是这段时间我对这个问题做了深入的研究。
其实也不算怎么深入了,就是对flex开始loading到初始化的这段过程分析下。
有一个不争的事实我们必须知道,下面是Adobe帮助文档的原话:
SystemManager 是在应用程序中创建的第一个显示类。它负责创建要显示的 mx.preloaders.Preloader 以及应用程序完成加载时显示的 mx.preloaders.SparkDownloadProgressBar,然后创建 mx.core.Application 实例。
所以我们必须从SystemManager入手,还好flex是开源的,提供SystemManager的源码。
打开SystemManager类:
构造函数里我们可以发现root.loaderInfo.addEventListener(Event.INIT, initHandler);说明监听了loaderInfo的init事件;
initHandler里面我们可以找到initialize();说明在这里进行了初始化;
initialize里面我们可以找到preloader = new Preloader();,说明开始创建Preloader对象,终于知道Preloader在哪初始化了。
打开Preloader类:
可以找到mx_internal function rslProgressHandler(event:ProgressEvent):voidmx_internal function rslCompleteHandler(event:Event):void
这两个就是RSL的progress和complete事件,然后我们发现这两个函数里面都有dispatchEvent(rslEvent); 这句话。说明这两个事件是可以被Preloader
的实例接收到的,这样的话,我们只要找到了preloader的实例就可以监听到RSL的加载进度和加载完成事件了。
回到SystemManager类:
我们已经知道preloader在哪初始化了,下面只要在Loader的时候能访问到preloader就大功告成了。
initialize里面我们可以找到_popUpChildren.addChild(preloader);,说明在popUpChildren里面可以找到preloader。
我们知道SystemManager有popUpChildren的get方法。说明popUpChildren是可以获取到的,这样我们顺藤摸瓜已经找到解决办法了。
最后在加上一句SystemManager怎么获取呢?  很简单当swf被Loader加载的时候,Loader的content属性就是个SystemManager对象。
下面附上我写的一段代码,以备需要的时候直接过来取:
            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);
            }
完!

转载于:https://www.cnblogs.com/huomiao/archive/2012/12/10/2811368.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全球数字经济十大发展趋势

来源:CIE智库摘要:当前,信息网络技术加速创新,以数字化的知识和信息作为关键生产要素的数字经济蓬勃发展,新技术、新业态、新模式层出不穷,成为“后国际金融危机”时代全球经济复苏的新引擎。当前&#xff…

数据结构之二叉树的遍历

二叉树的遍历分为前序遍历,中序遍历,后序遍历,层序遍历,在本文中,前三种由递归实现,层序遍历由队列实现。 #include "stdio.h" #include "stdlib.h" #include "windows.h" …

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 5丨员工奖金【难度简单】

活动介绍: 「数据仓库技术交流群」已经正式启动每日SQL打卡,帮助大家扎实基础,努力工作之余,别忘了自我提升。 欢迎报名和邀请小伙伴参与,一个人可能走得很快,但一群人会走得很远。 🍅题目汇总(…

从换脸到换姿势,AI 在图像处理的道路上越走越魔幻

来源:专知加州大学伯克利分校的研究人员,近日在著名预印本网站 arXive 上,发布了最新的图像迁移成果:人体姿势和舞蹈动作迁移。旨在把专业舞蹈演员的动作迁移到不会跳舞的人身上,算法输出流畅,还原度极高。…

sql中的并、交、差

⑸ 集合运算连接 有时候,用户希望在SQL查询中利用关系代数中的集合运算(并、交、差)来组合关系,SQL为此提供了相应的运算符:UNION、INTERSECT、EXCEPT(oracle的minus?),分别对应于集合运算的∪、∩、-。它…

C语言实现大数据除法

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A B * Q R成立。 输入格式: 输入在1行中依次给出A和B,中间以1空格分隔。 输出格式: 在1行中依次输出Q和R&a…

每日一道题,划水有意义,看我不卷死你们(评论送书)

🍅 作者主页:不吃西红柿 🍅 简介:CSDN博客专家 & 总榜前十🏆、HDZ核心组成员。欢迎点赞、收藏、评论 🍅 粉丝专属福利:知识体系、面试题库、技术互助、简历模板。文末公众号领取 &#x1f…

计算机视觉已超越人类眼睛?腾讯优图与《科学》杂志全面解读

来源: 腾讯研究院摘要:视觉是人类认知世界的重要组成部分,而计算机视觉作为人工智能的核心技术之一,近几年的发展现状如何?视觉是人类认知世界的重要组成部分,而计算机视觉作为人工智能的核心技术之一,近几…

海量数据笔试真题

1、 海量数据分布在100台电脑中,想个办法高校统计出这批数据的TOP10。 方案1: s 在每台电脑上求出TOP10,可以采用包含10个元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。比如求…

ScrollView与TableView实现选择效果

在cocos2dx中,ScrollView与TableView都可以实现选择效果,其中ScrollView较为原始,TableView的格子大小可以不与winSize一样大。 ScrollView实现 #include "T25ScrollView.h" #include "AppMacros.h"CCScene* T25Scroll…

科学家发现新的人类脑细胞,或可解答一个难题

来源:中国生物技术网关于人类大脑最令人感兴趣的问题之一,也是神经科学家们最难回答的问题之一,就是到底是什么让我们的大脑与其他动物的大脑区别开来。Allen脑科学研究所的研究员Ed Lein博士说:“我们并不清楚是什么让人类大脑变…

Cocos2dx中零散知识点

cocos2dx中有三种定时器:schedule,scheduleUpdate,scheduleOnce。功能分别是 每隔几秒调用自定义函数、调用系统默认的update()函数、只调用一次自定义函数 1、scheduleUpdate 加入当前节点后,程序会每帧都会自动执行一次默认的…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 6丨统计各专业学生人数【难度中等】

活动介绍: 「数据仓库技术交流群」已经正式启动每日SQL打卡,帮助大家扎实基础,努力工作之余,别忘了自我提升。 欢迎报名和邀请小伙伴参与,一个人可能走得很快,但一群人会走得很远。 🍅题目汇总(…

五问智能教育未来发展:重点解决什么问题?

来源:人民日报日前,首届中国智能教育大会在北京举行,教育部有关负责人、人工智能专家和教育专家、一些地方政府及教育行政部门负责人、大中小学校长、教师和企业家等近1000人参加。与会代表认为,智能教育将会越来越多地影响每一个…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 6丨寻找用户推荐人【难度简单】

活动介绍: 「数据仓库技术交流群」已经正式启动每日SQL打卡,帮助大家扎实基础,努力工作之余,别忘了自我提升。 欢迎报名和邀请小伙伴参与,一个人可能走得很快,但一群人会走得很远。 🍅题目汇总(…

Ubuntu下Memcache的安装与基本使用

在全世界范围内很多大负载站点采用了Memcache作缓存服务,以分担数据库服务器的压力。 这里只介绍在Ubuntu下如何配置Memcache和如何在PHP使用Memecache,对于更深入的了解,比如Memcache的运作机理或更高级的应用还是Google一下…^_^ 关于Memca…

实现超级玛丽上下左右运动

用Cocos2dx实现超级玛丽&#xff0c;首先用帧循环定时器判断方向&#xff0c;再在类中实现运行以及判断是否能运动。 方向控制 void LayerGame::moveMario(float dt) { #ifdef WIN32short key;key GetKeyState(F);if (key < 0) _marioDir Common::RIGHT;key GetKeyStat…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 7丨大的国家【难度简单】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

自动驾驶前沿报告!解密六大关键技术,全球人才分布

来源&#xff1a;智东西摘要&#xff1a;清华-中国工程院知识智能联合研究中心从技术、人才、应用和趋势的维度盘点自动驾驶的发展。从传统车企到新造车势力&#xff0c;再到互联网大佬&#xff0c;都在加注自动驾驶。自动驾驶既指向了更高效安全的交通运营系统&#xff0c;也意…

利用工厂模式实现怪物系统

利用工厂模式可以有效的降低类与类的藕合性&#xff0c;增强代码的可重用性&#xff0c;工厂模式主要通过虚函数的原理进行。 当基类指针指向一个子类对象&#xff0c;通过这个指针调用子类和基类同名成员函数的时候&#xff0c;基类声明为虚函数「子类不写也可以」就会调子类…