2012-07-06 52 views
0

ActionScript似乎无法支持同步载入一个PNG。我尝试过异步加载它,但是接着出现让你的函数等待加载完成的问题。我无法做到这一点。我曾尝试在while循环中调用setInterval和setTimout,并在加载完成时中断,但我得到了一些非常神秘的行为。对于函数参数,我传递了一个名为doNothing的函数,它只是一个空函数。当我运行时,setInterval或setTimeout会一遍又一遍,很快。他们不再等待再次打电话之前提供的时间。另外,没有任何东西永远不会被呼叫。如何在ActionScript 3的函数调用中加载并返回.png文件?

这里是我的代码:

private function getData(extension:String):Bitmap 
{ 
    var loader:Loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); 
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onComplete); 
    loader.contentLoaderInfo.addEventListener(ErrorEvent.ERROR, onComplete); 
    loader.load(new URLRequest(baseDir + extension)); 

    while (bitmap == null) 
    { 
     var test:Number = setInterval(doNothing, 1000); 
    } 

    var ret:Bitmap = bitmap; 
    bitmap = null; 

    return ret; 
} 

function onComplete(event:Event):void 
{ 
    bitmap = Bitmap(LoaderInfo(event.target).content); 
} 

function doNothing():void 
{ 
    trace("did nothing"); 
} 
+0

文件加载协议应该有一个您可以绑定的事件,以便您在完全加载时收到通知。你在做什么?请输入密码? – TheZ 2012-07-06 19:09:20

+0

由于Flex使用单线程模型,试图实现类似的东西会导致界面在图像加载过程中冻结 因此,调用getData函数的代码应该监听,而不是直接期待数据。像TheZ说的那样,你想要做什么? – cporte 2012-07-06 19:42:53

+0

是的,这实际上是我需要的。 – user1507613 2012-07-06 19:44:34

回答

0

while循环不好在这里,因为它会导致您的客户端冻结(和冻结15秒将抛出一个错误)

建议的执行情况:

private var loader:Loader; 
private var onSuccess:Function; 

// onSuccess = function (bitmap:Bitmap) : void 
// onFail = function (e:ErrorEvent) : void 
private function getData(extension:String, onSuccess:Function, onFail:Function):void 
{ 
    this.onSucess = onSuccess; 
    loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); 
    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onFail); 
    loader.contentLoaderInfo.addEventListener(ErrorEvent.ERROR, onFail); 
    loader.load(new URLRequest(baseDir + extension)); 
} 

private function onComplete(event:Event):void 
{ 
    bitmap = Bitmap(LoaderInfo(event.target).content); 
    onSuccess.call(null, bitmap); 
    dispose(); 
} 

private function dispose():void 
{ 
    loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete); 
    loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onFail); 
    loader.contentLoaderInfo.removeEventListener(ErrorEvent.ERROR, onFail); 
    this.loader = null; 
    this.onSuccess = null; 
} 
相关问题