FlashActionscript学习:MovieClipLoader深入研究

使用moviecliploader下载过多的位图会带来计算机网络连接的拥塞,即使使用unloadClip方法取消下载,仍然不会有好转,引起这个现象的原因与这个类的实现细节有关系,我们虽然不能看到其实现的原理,但是通过它的表现,可以对其特性有所认识。

MovieClipLoader可以胜任一般的应用,但是对于一些大量的下载任务,如果使用不当,可能带来严重的网络负担和非常差的用户体验。

public loadClip(url:String, target:Object) : Boolean

首先需要指出的是,loadClip方法对于Flash编程人员来说是多线程的,不管其内部实现机制如何,一个事实可以证明这一点:我们可以使用loadClip方法同时下载多个图片,并把不同的图片放在不同或者相同的电影剪辑当中。(文档中仅仅指出可以放在同一个剪辑当中)。

第二点,MovieClipLoader.onLoadStart处理函数并不是调用loadClip后会立即触发。文档称,当被加载的剪辑或者图片的第一个字节被写入用户磁盘中时,此函数被调用。可以确定,当网络连接不可用或者被下载资源不可用的时候就可能用原不会触发此事件。

public unloadClip(target:Object) : Boolean

此方法是我们讨论的核心所在。官方loadClip文档称:“使用 MovieClipLoader.unloadClip() 可删除用此方法加载的影片或图像,或者取消正在进行中的加载操作。”我们知道,loadClip方法是需要占用网络连接核内存资源的,我们寄希望于一旦调用unloadclip则立即释放网络连接和内存资源。但是事与愿违!这是MovieClipLoader方法的关键问题。当AS调用MovieClipLoader.unloadClip()之后,并不一定会马上释放资源。当我们使用MovieClipLoader下载大量的图片的时候,虽然我们在调用unloadClip之后才下载新的图片,但是网络连接的使用将进一步累积增大,导致网络连接的暂时阻塞。

经过测试,调用loadClip方法之后,立即调用unloadClip方法是丝毫不起作用的,下载过程会继续进行,并且MovieClipLoader类的事件处理函数仍然会被调用。这看起来非常出乎人的意料之外!而且非常不合理,但是事实就是如此。另外,如果手动将被加载对象的目的剪辑删除(unloadMovie或者removeMovieClip),这将删除舞台上的剪辑,但是仍然不能释放MovieClipLoader所占用的资源。

事实证明,当MovieClipLoader.onLoadComplete被调用之后,再次使用unloadClip方法,将会删除被加载的剪辑,但是同时网络连接的占用也会被释放。但是这样做的并没有太大的意义,因为图片一旦开始下载,资源消耗是不可消除的,但这恰又是关键的资源。这段无意义的资源占用会字节导致用户计算机的网络阻塞,表现为上网速度突然降低,几秒钟之后恢复正常(这要看用户的网络速度如何以及同时下载的图片数有多大)。

unloadClip的存在的另外一个问题是MovieClipLoader.onLoadError事件的触发问题。官方文档指出:“如果您在正加载影片时发出此命令,则调用 MovieClipLoader.onLoadError。”但是通过我的测试,不论何时调用了unloadClip方法,MovieClipLoader.onLoadError都不会被触发!这是另一个非常惊人的现象!

现在我还没有找到一个方法,可以彻底的从内存中删除一个对象。我们知道,as是使用垃圾收集机制来管理内存的,我们并不能直接调用垃圾收集动作,也就是说,大多数时候,我们设置一个对象的唯一引用为null,那么可以判断这个对象已经符合垃圾收集的条件,但是这个对象并不会立即被破坏,它所占用的内存和其他资源并不会立即被释放。因此,我们没有办法在所有时候立即释放MovieClipLoader所占用的资源。

onLoadInit = function([target_mc:MovieClip]) {}

这里需要补充一点:onLoadInit是在调用被加载剪辑的第一帧的代码之后被触发。onLoadCompelete触发是在被加载对象的最后一个字节被写入用户磁盘的时候被调用,在此之后和onLoadInit之前,被加载对象的内部数据是不可用的。然而,这里的内部数据指的是被加载对象的帧代码以及其子剪辑,被加载对象本身的属性和方法是有效的!也就是说,将图片加载到mc中的过程中的任何时候,mc._x是始终可以被使用的。

最终结局

我使用sniffer观察IP数据包之后,发现多个MovieclipLoader会共用TCP:http网络连接,只要前一个任务下载完毕,就可以释放连接给下一个任务使用,这是MovieclipLoader实现中非常明智的地方。但是如果尚没有任务下载完毕,也就是没有空闲TCP:http网络连接,就会创建新连接,旧链接在任务完成或者其他很短的时间内被作废,通过观察发现,无论多少个MovieClipLoader同时下载多少个任务,并发使用中的网络连接数最多是10,但是已经开启却不再使用了的网络链接这可能很多。如果不断下载新图片并且在旧尚未下载完之前移除target_mc,由于无法立即释放这些被删除的图片所占用的TCP:http网络连接,那么会导致每添加一个新下载任务都会创建新连接,旧链接被作废。这样一来,无用的网络链接占用就会很多,导致网络阻塞。

重用网络连接的唯一方法:永远不要在onLoadCompelete完成之前删除一个被加载的图片;决定要下载一个新图片时要确定是否真的必须下载。

至此MovieclipLoader的关键问题就很明显了:MovieclipLoader类没有提供立即释放网络连接的方法,这是问题的根源。

时间: 2024-11-02 00:14:50

FlashActionscript学习:MovieClipLoader深入研究的相关文章

关于INNODB SYSTEM RECORD infimum和supremum的学习和实验研究

关于INNODB SYSTEM RECORD infimum和supremum的学习和实验研究 接上一篇  http://blog.itpub.net/7728585/viewspace-2063921/关于MYSQL INNODB index page header学习和实验总结  所用到的工具是自己写的mysqlblock和bcview,我放到了百度云盘http://pan.baidu.com/s/1num76RJ供大家下载和使用 接下来就是INDEX SYSTEM RECORDS,就是in

高校基于云服务的网络学习空间建设研究

高校基于云服务的网络学习空间建设研究 刘颖 邵雨舟 贾岚 史虹湘 李志伟 基于云服务提出在高校校园网内建设网络学习空间.网络学习空间包括数据中心.软件平台和学习平台.数据中心提供IaaS服务,向用户提供虚拟机.在虚拟机上安装软件.存放教学资料,提供统一的教学软件平台.学习平台提供虚拟机申请.虚拟实验室.网络课程和资源共享等功能.首先完成了网络学习空间架构分析,然后进行了系统设计,最后深入分析了学习平台中不同服务的工作流程或实现方式.为实现基于云服务的网络学习空间的建设提供了可行思路和具体的设计方

基于云的网络学习空间建设研究

基于云的网络学习空间建设研究 程源 甘琤 云计算的出现以及成熟应用,使现有网络学习模式有了更为广阔的空间,本文简单介绍了网络学习空间的特点以及空间建设模型的运行过程,并对网络学习空间建设管理的方式进行探讨,依照空间建设的资源共享.广泛使用.容易接受等特点,对领导扶持.团队组织.资源优劣.合作程度以及考核5个方面进行空间的建设研究,将这5个方面的内容有机融合,能够使基于云的网络学习空间有效运转,促进网络空间的运用,从研究网络学习空间建设入手,分析影响网络学习空间建设的重要指标,能够促进网络学习空间

Flash ActionScript学习:深入研究条件语句

条件|语句 在上一节中,我们初步尝试了条件语句的用法,由于条件语句是一个使用频率极高的语句,所以我们有必要现在对它进行深入一些的探究. 一.条件语句的基本格式 if(条件表达式){当条件为真的时候,所要执行的命令} 这种语句是:当条件为真的时候,执行命令:否则什么也不做. 现在我们利用前面学过的知识.来做一个实例,此实例的要求是:点击按钮后,如果输入文本中的文字是"虫子",那么虫子就运动,否则虫子什么也不做.请按照下列步骤操作: 1.在舞台上用文字工具拖出一个文本框,打开属性面板,将其

手工注射JSP学习_漏洞研究

1. 判断注入类型(数字型还是字符型)  字符型和数字型数据判断:(希望有人能进一步的细化,细分为数字型和字符型判断两部分)  http://www.test.net/index_kaoyan_view.jsp?id=117 And user>char(0)  http://www.test.net/index_kaoyan_view.jsp?id=117 And user<char(0)  http://www.test.net/index_kaoyan_view.jsp?id=117' A

手工注射php学习_漏洞研究

代码:  $conn=sql_connect($dbhost, $dbuser, $dbpswd, $dbname);  $password = md5($password);  $q = "select id,group_id from $user_table where username='$username' and password='$password'";  $res = sql_query($q,$conn);  $row = sql_fetch_row($res); 

手工注射asp学习_漏洞研究

ACCESS  查询数据库类型  http://www.zengke.com/product.asp?sort_id=24 and exists (select * from sysobjects) 查询表admin页面返回正常显示为有,错误为无. http://www.zengke.com//product.asp?sort_id=24 and exists (select * from admin) 查询admin表中的项admin /product.asp?sort_id=24 and e

SEO速成秘诀:大胆向竞争对手学习

在SEO行业,无论是菜鸟还是老手,都会遇到自己的瓶颈,一段时间内感觉自己做seo并不顺利,而且相比以前提高也不明显,为此,会有些烦躁和迷茫.怎样继续提高自己的技术呢?应该用如何的方法去学习?行业一直没有停止过发展,百度谷歌的算法也一直在调整,层出不穷的seo小技巧和更重要的运营维也在发生变化.就像一年前还能发百度知道的技巧现在肯定用不了了,你必须用最新的技巧才能做一些"坏事".的确是这样的啊,SEO行业有人进进出出,菜鸟进来接触行业,老鸟想办法提升,我们伴随着搜索引擎优化行业的壮大而不

PowerPoint在研究性学习中的应用

在平时开展的研究性学习中,从开题报告.小组谈论.合作交流到成果汇报等各个环节,PowerPoint都成为了必不可少的辅助工具.然而,在应用实践中我们发现,由于很多老师和学生缺乏了解,使得PowerPoint的一些十分有用的功能被忽略了,我们一起来看一看. 1.在小组讨论中,使用"会议记录"做电子笔记 由于研究性学习中的研究课题通常是由一个课题组集体承担的,因而要经常进行小组讨论.例如,各类演讲报告,就是在课题组讨论的基础上形成的,首先由课题组的一个主要的撰稿人制作一个演示文稿的初稿,然