flex 4 - 等待负载完成而不冻结

时间:2011-10-11 10:42:39

标签: image flex4

我想知道是否有可能实现任何逻辑来为图像完成加载而不会冻结。

为了我的应用程序,我创建了一个类,它在构造函数中获取图像url并使用“load()”函数加载mx.controls.Image。

见下面的课程

package com
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.*;
//import flash.net.URLRequest;

import mx.controls.Alert;
import mx.controls.Image;
//import mx.utils.OnDemandEventDispatcher;

public class SpriteImage extends Sprite
{
    //Pass the source path or url here.
    private var imageUrl:String;
    private var ready:int = -1;
    private var img:Image;

    public function SpriteImage(imgUrl:String)
    {
        //imageUrl = imgUrl;
        loadImage(imgUrl);
    }
    private function loadImage(imgUrl:String):void
    {

        img = new Image();
        img.addEventListener(Event.COMPLETE,onCompleteHandler);
        img.addEventListener(IOErrorEvent.IO_ERROR,onErrorHandler);     
        //img.source = imgUrl;
        img.load(imgUrl);

    }

    private function onCompleteHandler(e:Event):void{

        img.x = -(img.width/2);
        img.y = -(img.height/2);
        this.addChild(img);
        ready = 1;
    }

    private function onErrorHandler(e:IOErrorEvent):void
    {
        ready = 0;
        //Alert.show("Can't load :" + e.toString());
    }

    public function prepare():Boolean{

        while(ready == -1){
            trace(0);
        }           
        return ready;
    }
}

}

现在,我在主应用程序中使用此类

var img:SpriteImage = new SpriteImage(e.imageUrl);
img.prepare(); // just waits till image is loaded but freezes
var obj:DisplayObject = img;

现在的问题是应用程序永远不会出现在prepare()方法中。它冻结了浏览器,我必须杀死插件进程才能取消应用程序。

这里的主要标准是我需要等待图像完成加载,以便我可以在接下来的步骤中访问图像。我怎样才能做到这一点。?请帮忙

2 个答案:

答案 0 :(得分:1)

在我看来,你正在使用同时创建冻结(ready == -1)为什么不禁用用户进一步执行“步骤”的能力“直到图像加载?

您不必同步等待图像加载您现在的方式。加载图像后,您将通过其加载程序调度的完整事件获得通知。然后,您可以启用任何取决于正在加载的图像。

一种直接的方法是将应用程序中导航控件的 enabled 属性绑定到布尔属性。例如,在你的SpriteImage中添加

[Bindable] public var isImageLoaded:Boolean = false;

并在调用onCompleteHandler后将其设置为true。您可以绑定到该属性的值。另一种方法是从您的班级发送一个事件,以通知其他人图像已加载并且可能发生某些事情:]

火焰

答案 1 :(得分:0)

ProgressBar可能会在加载图片时以不冻结的方式为您的用户界面增添趣味。

查看Adobe docs for the ProgressBar control。标题为创建ProgressBar控件的段落有一个示例,说明如何在加载图像时显示ProgressBar