搜尋部落格文章

2011年12月20日 星期二

Loader,URLLoader,URLStream 比較

(1)Loader
Loader,用於加載外部的圖片和SWF文件。
如果加載圖片文件(jpg,gif,png等)時,Loader.content得到數據類型是Bitmap對象;
如果加載SWF文件(flash 9版本)時,Loader.content得到數據類型是MovieClip對象;
如果加載SWF文件(flash 9以前版本)時, Loader.content得到數據類型是AVM1Movie對象;

(2)URLLoader
以文本、二進制數據或URL編碼變量的形式從URL下載數據。在下載文本文件、XML或其它用於動態數據驅動應用程序的信息時,它很有用。 URLLoader對象會先從URL中下載所有數據,然後才將數據用於ActionScript。它會發出有關下載進度的通知,通過bytesLoaded和bytesTotal屬性以及已調度的事件,可以監視下載進度。 在加載非常大的視頻文件(如FLV的視頻文件)時,可能會出現內存不足錯誤。

(3)URLStream
提供對下載URL的低級訪問。數據一下載,便可隨即為應用程序使用,這和使用URLLoader時需要等到整個文件下載完不同。並且URLStream類還允許在完成下載前關閉流。已下載文件的內容將作為原始二進制數據提供。在URLStream中的讀取操作是非阻塞模式的。這意味著您在讀取數據之前必須使用bytesAvailable屬性來確定是否能夠獲得足夠的數據。如果不能獲得足夠的數據,將引發EOFError異常。 在默認情況下,所有二進制數據都是以Big-endian格式編碼的,並且最高位字節於第一位。

下面一個實例將被加載的配置文件以二進制數據讀取,這可以解決很多問題,比如對不同格式配置文件進行的處理


package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.net.URLRequest;
 import flash.net.URLStream;
 import flash.net.URLLoader;
 import flash.utils.ByteArray;
 import flash.net.URLLoaderDataFormat;
 
 public class Test extends Sprite {
  public function Test(){
   //testURLLoader();   
   testURLStream();
  }
  
  private function testURLLoader():void {
   var urlLoader:URLLoader = new URLLoader();
   urlLoader.dataFormat = URLLoaderDataFormat.BINARY; //原始二进制数据   
   urlLoader.addEventListener(Event.COMPLETE, completeHandler);
   urlLoader.load(new URLRequest("02.xml:"));
  }
  
  private function completeHandler(event:Event):void {
   trace("配置文件是ANSI :" + event.target.data); // 如果配置文件是ANSI等,会出现中文字乱码   
   //URLLoader如果遇到乱码,则可以转换(利用标准的xml格式Excle可以解决乱码问题就是基于这里):   
   var _byteArray:ByteArray = new ByteArray;
   _byteArray.writeBytes(event.target.data);
   _byteArray.position = 0;
   //如果是xml文档   
   var xml:XML = XML(_byteArray.readMultiByte(_byteArray.length, "chinese")); //简体中文 (GB2312)   
   trace(xml);
  }
  
  private function testURLStream():void {
   var stream:URLStream = new URLStream();
   stream.addEventListener(Event.COMPLETE, complete);
   stream.load(new URLRequest("02.xml"));
  }
  
  private function complete(event:Event):void {
   var stream:URLStream = event.target as URLStream;
   var xml:XML = XML(stream.readMultiByte(stream.bytesAvailable, "chinese")); //简体中文 (GB2312)   
   trace(xml);
  }
 }
}

沒有留言:

張貼留言