位图图像的异步解码

Flash Player 11 和更高版本,Adobe AIR 2.6 和更高版本

使用位图图像时,可以异步解码和加载位图图像,以改善应用程序的感知性能。在许多情况下,异步解码位图图像所需的时间可能和同步解码图像相同。但是,在关联的 Loader 对象发送 COMPLETE 事件之前,位图图像会在单独的线程中进行解码。因此,您可以在加载较大的图像后,对其进行异步解码。

借助 flash.system 包中的 ImageDecodingPolicy 类,您可以指定位图加载方案。默认加载方案为异步。

位图解码策略

位图加载方案

说明

ImageDecodingPolicy.ON_DEMAND

同步

在访问图像数据时,对加载的图像进行解码。

使用此策略可以解码较小的图像。如果您的应用程序不依赖复杂的效果或过渡,则也可以使用此策略。

ImageDecodingPolicy.ON_LOAD

异步

在加载时,在调度 COMPLETE 事件之前对加载的图像进行解码。

此策略是处理较大(大于 10 MP)图像的理想之选。当开发具有页面过渡效果的基于 AIR 的移动应用程序时,使用此位图加载策略可以改善应用程序的感知性能。

注: 如果加载的文件是位图图像,并且使用的解码策略为 ON_LOAD ,则该图像将在 COMPLETE 事件调度之前进行异步解码。

以下代码显示了 ImageDecodingPolicy 类的用法:

var loaderContext:LoaderContext = new LoaderContext(); 
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD 
var loader:Loader = new Loader(); 
loader.load(new URLRequest("http://www.adobe.com/myimage.png"), loaderContext);

您仍然可以通过 Loader.load() Loader.loadBytes() 方法使用 ON_DEMAND 解码。但是,所有其他使用 LoaderContext 对象作为参数的方法,将忽略传递的任何 ImageDecodingPolicy 值。

下面的示例显示了同步和异步解码位图图像的差异:

package 
{ 
    import flash.display.Loader;   
    import flash.display.Sprite;  
    import flash.events.Event; 
    import flash.net.URLRequest; 
    import flash.system.ImageDecodingPolicy; 
    import flash.system.LoaderContext; 
 
    public class AsyncTest extends Sprite 
    { 
        private var loaderContext:LoaderContext; 
        private var loader:Loader; 
        private var urlRequest:URLRequest;         
        public function AsyncTest() 
        { 
            //Load the image synchronously 
            loaderContext = new LoaderContext(); 
            //Default behavior. 
            loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_DEMAND;             
            loader = new Loader();     
            loadImageSync();                     
             
            //Load the image asynchronously 
            loaderContext = new LoaderContext(); 
            loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD;             
            loader = new Loader(); 
            loadImageASync();     
        } 
         
        private function loadImageASync():void{ 
            trace("Loading image asynchronously...");             
            urlRequest = new URLRequest("http://www.adobe.com/myimage.png");     
            urlRequest.useCache = false; 
            loader.load(urlRequest, loaderContext);                     
            loader.contentLoaderInfo.addEventListener 
                (Event.COMPLETE, onAsyncLoadComplete); 
        } 
         
        private function onAsyncLoadComplete(event:Event):void{             
            trace("Async. Image Load Complete"); 
        }     
     
        private function loadImageSync():void{             
            trace("Loading image synchronously...");             
            urlRequest = new URLRequest("http://www.adobe.com/myimage.png");     
            urlRequest.useCache = false; 
            loader.load(urlRequest, loaderContext); 
            loader.contentLoaderInfo.addEventListener 
                (Event.COMPLETE, onSyncLoadComplete); 
        } 
         
        private function onSyncLoadComplete(event:Event):void{             
            trace("Sync. Image Load Complete"); 
        } 
    } 
}

有关不同解码策略的效果说明,请参阅 Thibaud Imbert:Adobe Flash 运行时中的异步位图解码