Flex延时加载

基本原理的测试:在舞台建一空白MC,取名mymc,保存在桌面,在桌面放一张图片1.jpg
1,你写下以下代码测试:
mymc.loadMovie("1.jpg")
trace(mymc._width)
输出:0
哼!内部装了那么大一张图片,居然不改变宽度?有经验的朋友都知道,如果你要做的效果要用到mymc的宽度,是无法调用的。
2,再写下以下代码测试:
var ml=new MovieClipLoader()
ml.addListener(this)
ml.loadClip("1.jpg",mymc)
trace(mymc._width)
输出:0
同样的效果
3,好,那我用下面的代码来试试:
var ml=new MovieClipLoader()
ml.addListener(this)
ml.loadClip("1.jpg",mymc)
this.onLoadComplete=function(){
trace(mymc._width)
}
输出:0
看来onLoadComplete也是不堪重任。
4,那用onLoadInit吧,”王牌“
var ml=new MovieClipLoader()
ml.addListener(this)
ml.loadClip("1.jpg",mymc)
this.onLoadInit=function(){
trace(mymc._width)
}
输出了我们要的数据,就是他了,我们要的宽度。
5,虽然达到了效果,但我们既然是在载入,就不得不考虑attachmovie把图片转成MC(一定得转为MC,直接在库中图片上设linkage是不行的),linkage设为pic
mymc.attachMovie("pic","pic1",3)
trace(mymc._width)
输出正常,这个很容易理解,他是影片内部库中的东西, 不存在延迟问题。
阐述一下我对上面总结吧:
1,2————loadmovie和直接用loadclip载入外部文件,都无法立刻取得相关信息。
3,4————MovieClipLoader是延迟的客星,但onLoadComplete不堪重任,onLoadInit才是最佳选择。
5—————attachMovie可以避免延迟,但是不推荐使用,图片一多,你有那么大库装吗?

///

应用效果:
今天在研究bitmapdata类,所以就用我今天的一个例子来说吧,我贴出我原来的代码,是什么效果,我就不说了,表达不清楚,知道这个类的一看就会明白我的意图,不知道这个类的,我觉得你更要看。
舞台两个空MC,一个为mymc,一个为source
原来的代码:import flash.display.BitmapData;
var ml=new MovieClipLoader()
ml.addListener(this)
ml.loadClip("1.jpg",source)
source._width=50
source._height=50
var bm:BitmapData = new BitmapData(500,300, false,0xaa3344); 
bm.draw(mymc)
mymc.attachBitmap(bm, 3, "always", true);
毫无效果。
后来改正后的代码:import flash.display.BitmapData;
var ml=new MovieClipLoader()
ml.addListener(this)
ml.loadClip("1.jpg",source)
this.onLoadInit=function(){
source._width=50
source._height=50
var bm:BitmapData = new BitmapData(500,300, false,0xaa3344); 
bm.draw(mymc)
mymc.attachBitmap(bm, 3, "always", true);
}

效果正常了


Wikipedia把延迟加载定义为:一种常用的编程设计模式,用以推迟一个对象的载入时机至需要此对象的时候。我们使用延迟加载主要是为了增加RIA应用的响应速度 -- 由于我们不需要从后台一次性的调用一大堆的数据,用户无需为某次调用而等待很长的事件。此模式在设计时对未知深度的嵌套分级数据类(祖父级,父亲级,儿子级等等)特别有用。
同时,它还有以下优点:


必需性

如果你的客户端是用AS3代码的,如果服务端不能一次性给你整个树,试下一次加载所有的数据(例如启动的时候)。
一些语言允许你加载基础水准的东西,循环通过每个对象和加载他的子对象等等。
在Actionscript中,服务端逻辑的调用都是异步的,这意味着你的调用只是你所有逻辑中的一小部分,这样你无法控制响应结果的返回时机。
但是,当元件做此逻辑调用的时候它会带出一个事件,当此事件告诉你结果可用的时机。
在某个层面上来讲这一点很好,它允许程序当数据调用后保持随时响应。然而,它还是有点强制你在你的代码的不同方法中传播数据的加载。由于你无论如何都要做这个,它开始给人一种“即时加载”的错觉多过一次性加载。

透明性
如果所有的数据在服务端加载完,这也是你的应用在开始的时候取得单个“数据堆”的主要方法,这将有许多代码在运行但是代码中不显示。例如,你将有可能等到一个分级的XML,这个对原始开发者很明了,但是对后面加入的开发者就很茫然了。当你可以看到何处何如何加载每个级别的对象被加载,代码将会更容易被理解和调试。

简单性
如果在某个时候仅关注某一级别的对象,代码将比递归至一位置深度的树形结构的代码变得简单多了。相反的,代码可以简单的一次性做完某件事情。当你所有的实例对象都是相同的基本类型的时候尤为凸显。
延迟加载简化了不知是客户端的代码,同时也简化了服务端的代码。数据的取得在一个简单点的格式中可以返回简单得多的信息,所以代码在服务端将获更加轻量化和更加快速的响应。


希望对延迟加载的这个简单的总结没有影响到你对使用它的兴趣。如果你想看一下延迟加载的例子,来看看这个例子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值