使用Loader载入和组织资源分布

使用Loader载入和组织资源分布
2010年10月23日
  对于一个大型应用程序,资源和代码不可能全部包含在一个swf文件中。资源应该分布到不同的位置,就像组建网站一样。网站是依靠网页组建成整个网站的框架,每个网页通过标签载入外部文件。在页面中标签可以载入外部内容,也可以通过标签把部分内容写在网页中,例如js代码和xml文件。as3应用程序的组织与网站管理类似,支撑网站架构的是swf文件,实现载入的不是标签,而是Loader加载器。
  虽然b/s结构的as3应用程序也以网页形式出现,但是网页只起到辅助作用,网页使用activeX控件播放swf文件,相当于flash播放器。组织整个as3应用程序的类主要有Loader类、LoaderInfo类、LoaderContex类、ApplicationDomain和SecurityDomain类,其中最核心的类是Loader类。 Loader[b]类的特点 [/b]Loader只能载入外部图片和swf,在格式上有局限性,但Loader提供从内存中加载图片和swf的方法,可以配合URLLoader进行扩展,从而对外部资源进行加密或分割。Loader侧重点不在于加载的数据类型,而在于组织应用程序资源分布。当加载图片时,Loader是一个纯粹的资源加载器;但当加载包括代码的swf时,Loader变成了应用程之间的连接器,是swf文件之间的纽带,由于swf中又可以使用Loader载入swf,Loader成为树状资源分布结构中的节点。Loader承载如此重要功能,为此as3对Loader进行了精心的设计: 1. 轻量级 Loader直接继承于DisplayObjectContainer,增加的成员只有7个,保证在复杂的应用程序中不会因为大量的Loader导致体积迅速膨胀。 2. 功能单一 由于设计目的明确,虽然是容器,但只能放入一个显示子对象,再次表明只用于加载,不做普通容器使用,尝试增删子对象的代码会引发错误。 3. 运行稳定。 即使加载复杂的swf也能保证正常运行。每个swf的root属性引用自身的文档类对象,避免载入后导致路径错误。 4. 加载机制成熟。 Loader使用LoaderInfo作为加载信息对象,加载信息被加载器和加载内容共享,可控制性强。Loader使用安全域和应用程序域对加载代码进行管理,满足不同的需求。 [b]加载过程 [/b]一个正常的资源加载过程如下:
  资源加载过程与数据加载过程很相似,但最大的区别是在信息对象的事件中处理数据而不是在加载器事件中处理数据,这是初学者最容易犯错地方。所有的加载事件都定义在LoadrInfo对象中,Loader本身没有定义加载事件,这是需求所致,因为LoaderInfo对象被加载器和被加载的内容共享,两方面都要了解加载状态和加载信息。对于加载器,LoaderInfo对象是Loader的contentLoaderInfo属性,对于被加载的swf而言,LoaderInfo是文档类的loaderInfo属性,如下图:
  loaderInfo属性是显示对象的属性,所有显示对象的loaderInfo都指向文档类的LoaderInfo对象,就像stage属性一样。Loader也是显示对象,因此也有loaderInfo属性,为了区分自身的加载信息和加载内容的加载信息,Loader把加载内容的加载信息定义为contentLoaderInfo属性,自身 loaderInfo属性仍然指向文档类的loaderInfo。 LoaderInfo[b]对象记录的信息 [/b]对于加载器的contentLoaderInfo属性默认虽然不为空,但却是个临时对象,在加载过程中会慢慢收集信息更新这个对象,等到加载完毕后共享信息才完整。所以在加载过程中,你只能访问共享信息中的加载进度,网络状态等信息,不能访问加载内容的完成信息。
  对于文档类的LoaderInfo属性,当swf文件被创建时就记录了swf的信息,这个swf被加载后这些信息会和加载器一同共享。LoaderInfo中包含的信息丰富,它不仅记录swf的创建信息,还反应运行环境,加载内容的安全域和应用程序域。 [b]包含引用 [/b]content:DislayObject 加载内容的引用,与Loader的content属性相同。
  loader:Loader
  加载器的引用。 [b]加载内容信息 [/b]contentType:String 加载类型,如下表: bytesLoaded:uint 已加载字节数。
  bytesTotal:uint
  总字节数。开始为0,触发prgrass事件后可访问。
  width:int
  加载内容的宽度。
  height:int
  加载内容的高度。
  frameRate:Number
  加载swf帧速。
  url:String
  加载内容的网址,忽略参数。
  bytes:ByteArray
  加载内容的二进制数据。通过这个属性可以把加载内容进行复制。
  actionScriptVersion : uint
  加载内容的as版本。
  swfVersion : uint
  发布swf的版本
  [b]文档类[/b]swf[b]信息 [/b]loaderURL:String 加载器所在文档类地址,忽略参数。
  parameters:Object
  来自页面设置的变量。
  [b]安全访问 [/b]childAllowsParent:Boolean 子集是否可以被父级访问。
  parentAllowsChild:Boolean
  父级是否可以被子集访问。
  [b]应用程序域 [/b]applicationDomain:ApplicationDomain 通过loaderContext参数指定载入的应用程序域。
  sameDomain:Boolean
  子集和父级是否在相同的安全域中。 [b]跨边界事件 [/b]sharedEvents:EventDispatcher 共享的EventDispatcher对象,EventDispatcher不属于任何一方,用于跨边界交换事件,即使双方互不信任也可以访问EventDispatcher属性。sharedEvents主要用于在不同安全域的swf交换数据。 [b]两种加载方法 [/b]可以使用两种方式加载资源: 1. 从外部加载 使用load(request:URLRequest, context:LoaderContext = null):void方法加载外部文件,例如: 2. 从内存中加载 使用loadBytes(bytes:ByteArray, context:LoaderContext = null):void从内存中加载,二进制必须是Loader可以识别的数据类型。例如: 当需要对载入的资源加密时,把加密的资源载使用URLRequest、URLStream、Socket载入后进行解密,然后通过Loader从内存中加载。当需要进行资源分割时,把需要的资源打包到一个压缩文件中以二进制形式载入后解密,根据每个文件的大小和顺序进行分离。然后使用Loader从内存中分别载入。 [b]加载路径 [/b]加载过程中可能会在加载路径上犯错: [b]顶级路径问题: [/b]一个swf能加载同级下的文件,但是把这个swf载入到另外一个不同目录的swf中加载文件就会找不到路径,那是因为新的路径是相对于顶级文档类的。 [b]网页中的[/b]swf 如果把一个包含加载器的swf放置在网页中,而网页和swf不在一个目录下会导致路径错误,因为所有加载路径都相对于包含swf的网页。 [b]监视加载进度 [/b]通过LoaderInfo对象加载器和被加载的swf都可以监视加载进度,两方都可以制作加载进度条。在被加载的swf中制作进度条时,由于每个显示对象的laoderInfo属性都指向文档类对象的loaderInfo,进度条可以直接通过自己的loaderInfo属性获取加载进度,从中也可以看出这种设计带便利。 [b]监视完成的两种事件 [/b]加载完毕有两种事件:init事件和complete事件。init事件表示loaderInfo对象的信息已经完全更新,swf代码已经被初始化。此时swf可能还未完全下载,例如swf中包含大体积的视频。只有等所有数据加载完毕后才会触发complete事件。
  当加载的swf很小时,选择init和complete事件皆可,当加载体积较大的素材swf时,必须使用complete事件。 [b]处理加载错误 [/b]资源加载与数据通信一样使用异步错误处理,由于使用http通信,因此也有httpStatus事件。当加载被卡住时,必须关闭连接重新进行加载。设置正确的间隔时间算法关系到重载机制的优劣,常用的一个算法是通过倍数加乘进行重载,例如第一次重载时间=间隔时间×2,第二次重载时间=间隔时间×4……。 [b]加载的[/b]swf[b]访问舞台 [/b]当swf加载完毕后,会先初始化swf中的代码,但此时swf还未被添加到加载器的显示列表,只有等到触发Complete后,loader才把加载内容添加到舞台的显示列表中。如果加载的swf的构造函数中引用了stage则会报告不能访问舞台的错误。要解决此错误需要在loaderInfo的init或complete中或addToStage事件中初始化,也使用render事件延迟初始化。
  在加载swf的构造函数中root属性可以访问,因为root引用的是加载swf的文档类对象而不是加载器的文档类对象。 [b]关闭连接与卸载内容 [/b]close()方法用于关闭正在加载的连接,可以在加载失去响应时调用。unload()方法用于卸载加载对象,卸载的对象不会马上消失,而是在内存中等待垃圾回收,此时加载内容已与Loader的引用断开,也不在Loader的显示列表中。如果原始内容未卸载就加载了新内容,则旧的内容被强制卸载。
  为了让卸载的内容能够被垃圾回收,除了使用unload()方法,还必须停止内容中的所有活动对象,例如动画,声音,视频等。Loader类为我们提供了一个unloadAndStop(gc:Boolean = true):void方法,unloadAndStop()方法先停止内容中的所有活动对象,然后再执行卸载,最后根据gc参数尝试强制垃圾回收。gc是一件耗费cpu的工作,如果发现卸载对象时导致很卡,可以设置gc为false让播放器选择时机回收。
  unload()和unloadAndStop()方法会触发unload事件,调用unload()方法后,contentLoadInfo属性会建立一个新临时对象,所有的属性会被重置为null。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值