【问题标题】:Load images in the background using Flex使用 Flex 在后台加载图像
【发布时间】:2009-01-06 18:41:40
【问题描述】:
在我的 Flex 应用程序中,我调用了一个 Web 服务,它返回几十个“项目”,其中每个项目都有一个关联的图像 url。我根据这些数据创建了一个模型,并将图像组件源属性绑定到 url 字符串。
我希望更好地控制这些图像的加载,尤其是它们的加载顺序。我还想预加载不一定绑定到组件的图像。本质上,我想加载用户将首先看到的图像,然后在背景中加载他们稍后可能会看到的图像。
我可以利用 Flex 中的机制在后台加载图像吗?
【问题讨论】:
标签:
apache-flex
actionscript-3
【解决方案1】:
将文件放入队列中并一个接一个地加载它们。 Flex(框架)不会为您执行此操作,但您可以相对轻松地在 AS3 中编写自己的代码。
我个人对此使用自己的解决方案,但也有很多可用的现有解决方案;最常见的可能是Bulk Loader。
【解决方案2】:
据我所知,没有开箱即用的机制,不,但您总是可以使用 URLLoader 以某种方式将图像加载到 Timer 上,以检索和存储每个字节的字节图像,直到你需要它们。根据模型的设置方式(例如,您可以将每个图像作为 ByteArray 存储在 ArrayCollection 中),这应该是一件相对简单的事情。这有帮助吗?
【解决方案3】:
我创建了一种机制来从 XML 文件中读取 URL 列表并在后台或按需加载它们(以先到者为准)。预加载只是加载图像并且对它没有任何作用;它依赖于浏览器缓存来保存该图像,直到 UI 执行“加载”并立即返回它。
GalleryImageItem.status 更适合调试。 UI 对预加载器一无所知(也不必与之协调)。
干杯
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
包 com.santacruzsoftware.lib
{
公共类 GalleryImageItem 扩展对象
{
公共静态常量卸载:int = 1;
公共静态常量预加载:int = 2;
公共静态常量预加载:int = 3;
公共静态常量 PRELOAD_FAILED : int = 4;
公共静态常量加载:int = 5;
公共静态常量加载:int = 6;
公共静态常量 LOAD_FAILED : int = 7;
私有变量_resourceName:字符串;
私有变量_detailResourceName:字符串;
私有变量 _caption : 字符串;
私有变量 _status : int;
公共函数 GalleryImageItem(aResourceName : String = "", aCaption : String = "", aDetail : String = "")
{
极好的();
_resourceName = aResourceName;
_caption = aCaption;
_detailResourceName = aDetail;
_status = 已卸载;
}
公共函数获取 detailResourceName() : String{ return _detailResourceName }
公共函数集 detailResourceName(value : String) : void { _detailResourceName = value }
公共函数获取资源名称():字符串{返回_资源名称}
公共函数集资源名称(值:字符串):无效{_资源名称=值}
公共函数获取标题():字符串{返回_标题}
公共函数集标题(值:字符串):无效{_caption =值}
公共函数获取状态():int { return _status }
公共函数设置状态(值:int):无效{_status =值}
}
}