使用Flex在后台加载图像

时间:2009-01-06 18:41:40

标签: flex actionscript-3

在我的Flex应用程序中,我调用一个Web服务,该服务返回几十个“项目”,其中每个项目都有一个关联的图像URL。我基于这些数据创建了一个模型,并将图像组件的source属性绑定到url字符串。

我希望能够更好地控制这些图像的加载,尤其是它们的加载顺序。我还想预先加载不一定与组件绑定的图像。基本上我想加载用户首先看到的图像,然后在后面加载他们可能会看到的图像。

Flex中是否有一种机制可以用来在后台加载图像?

3 个答案:

答案 0 :(得分:2)

将文件放入队列并一个接一个地加载它们。 Flex(框架)不会为您执行此操作,但您可以相对轻松地在AS3中编写自己的。

我个人使用自己的解决方案,但也有一堆可用的现有解决方案;最常见的可能是Bulk Loader

答案 1 :(得分:0)

据我所知,没有一个开箱即用的机制,没有,但你总是可以通过URLLoader以某种方式加载Timer上的图像来检索和存储每个的字节。直到你需要它们为止。根据模型的设置方式(例如,您可以将每个图像存储为ArrayCollection中的ByteArray),它应该是一个相对简单的事情。这有帮助吗?

答案 2 :(得分:0)

我创建了一种机制,用于从XML文件中读取URL列表,并在后台或按需加载它们(以先到者为准)。预加载只是加载图像,并没有任何东西;它取决于浏览器缓存来保存该图像,直到UI执行“加载”并立即返回它。

GalleryImageItem.status更多用于调试而不是其他任何东西。用户界面对预加载器一无所知(并且不必与之协调)。

干杯


         private var BackgroundLoaderIndex : int = -1;
         private var BackgroundImageLoader : Loader = null;         

         private var GalleryCanvasIndex : int = -1;          
         private var BackgroundGalleryLoadTimer : Timer;

         [ArrayElementType("GalleryImageItem")]
         private var GalleryImageArray : Array =  new Array();

        private function Initialize(event : Event) : void
        {   
            LoadGalleryImageArray();            

            BackgroundGalleryLoadTimer = new Timer(4000);
            BackgroundGalleryLoadTimer.addEventListener(TimerEvent.TIMER, BackgroundGalleryLoad);
            BackgroundGalleryLoadTimer.start();
        }

        private function LoadGalleryImageArray() : void
        {           
            var Galleries : XMLList = PageTextsXML.elements("Gallery").elements("GalleryImage");        

            for (var counter : int = 0; counter 

    package com.santacruzsoftware.lib
    {
        public class GalleryImageItem extends Object
        {
            public static const UNLOADED : int = 1; 
            public static const PRELOADING : int = 2; 
            public static const PRELOADED : int = 3; 
            public static const PRELOAD_FAILED : int = 4; 
            public static const LOADING : int = 5; 
            public static const LOADED : int = 6; 
            public static const LOAD_FAILED : int = 7; 

            private var _resourceName : String;
            private var _detailResourceName : String;
            private var _caption : String;
            private var _status : int;

            public function GalleryImageItem(aResourceName : String = "", aCaption : String = "", aDetail : String = "")
            {
                super();

                _resourceName = aResourceName;
                _caption = aCaption;
                _detailResourceName = aDetail;
                _status = UNLOADED;
            }

            public function get detailResourceName() : String{ return _detailResourceName }
            public function set detailResourceName(value : String) : void { _detailResourceName = value }
            public function get resourceName() : String{ return _resourceName }
            public function set resourceName(value : String) : void { _resourceName = value }
            public function get caption() : String{ return _caption }
            public function set caption(value : String) : void { _caption = value }
            public function get status() : int { return _status }
            public function set status(value : int) : void { _status = value }
        }
    }