0

ActionScript は、png の同期読み込みをサポートしていないようです。非同期でロードしようとしましたが、ロードが完了するまで関数を待機させるという問題があります。私はこれを達成することはできません。while ループで setInterval と setTimout の両方を呼び出し、ロードが完了したときに中断しようとしましたが、非常に不思議な動作が発生します。function パラメーターには、単なる空の関数である doNothing という関数を渡します。実行すると、setInterval または setTimeout が非常に速く何度も繰り返されます。彼らは再び電話をかける前に提供された時間を待ちません。また、doNothing が呼び出されることはありません。

これが私のコードです:

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");
}
4

1 に答える 1

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;
}
于 2012-07-08T15:23:10.273 に答える