无法从完全加载的静态变量AS3中检索数据

时间:2016-10-17 07:20:24

标签: actionscript-3 flash asynchronous

基本上我试图在URLLoader()的帮助下读取二进制图像,并在flash中再次将其转换为图像。

我写了两个静态方法,其中一个读取图像并将数据属性设置为二进制,另一个是COMPLETE处理程序。
在COMPLETE处理程序中,我将二进制数据转换为 ByteArray 并将其分配给静态变量。然后试图从主时间线访问它,但它不会工作。

问题是我的临时变量没有完全加载静态变量,当我检查 BytesAvailable 时,它只有2个。
我做错了什么?

COMPLETE处理程序:

public static function compHand(e:Event):void
    {
        var myByteArray:ByteArray = URLLoader(e.target).data as ByteArray;
        LoaderToObject.ImageBytes = myByteArray;

        trace(myByteArray.bytesAvailable);
        if (LoaderToObject.ImageBytes.length != myByteArray.length)
        {
            trace(myByteArray.length);
            trace(LoaderToObject.ImageBytes.length);
        }
        else
        {
            trace("successFully loaded!");
        }

    }

public static function loadBin(FileUrl:String)
    {
        var imageBytes:ByteArray=new ByteArray();
        var binUrl:URLRequest = new URLRequest(FileUrl);
        var binLoader:URLLoader = new URLLoader(binUrl);
        binLoader.dataFormat = URLLoaderDataFormat.BINARY;
        binLoader.addEventListener(Event.COMPLETE,compHand);
        //trace(LoaderToObject.ImageBytes);
        trace(FileUrl);
    }

我在main timeLine中使用的函数:

function loadfile(e:MouseEvent):void
  {
     LoaderToObject.loadBin("chick.bmp");//send file to URLLoader
     imageBytes= LoaderToObject.ImageBytes;
     MakeImage2(imageBytes);

  }

请帮帮我

1 个答案:

答案 0 :(得分:1)

由于URLLoader是异步的,因此当您尝试访问imageBytes时,imageBytes尚未加载完成。

您需要将回调函数传递给loadBin,以便在加载完成时调用

这是一个例子

加载类

Class MyLoader  {

     private var callback:function;

     private var binLoader:URLLoader;

     public function load(FileUrl:String, $callback:Function):void
     {
         callback = $callback;

         //your code
         var imageBytes:ByteArray=new ByteArray();
         var binUrl:URLRequest = new URLRequest(FileUrl);
         binLoader = new URLLoader(binUrl);
         binLoader.dataFormat = URLLoaderDataFormat.BINARY;
         binLoader.addEventListener(Event.COMPLETE,compHand);
         //trace(LoaderToObject.ImageBytes);
         trace(FileUrl);
     }

     private function compHand(e:Event):void
     {
         var myByteArray:ByteArray = URLLoader(e.target).data as ByteArray;

         if (callback != null)
         {
              callback(myByteArray, this);
         }

      }
}

LoaderToObject的加载函数

//make MyLoader class live, it's important
private var loadValidDic:Dictionary = new Dictionary();

public static function loadBin(FileUrl:String, callback:Function)
{
     var loader:MyLoader = new MyLoader();

     loadValidDic[loader] = callback;

     loader.load(FileUrl, internalComplete);
}

private static function internalComplete(ba:ByteArray, loader:MyLoader):void
{
    var callback:function = loadValidDic[loader];

    if (callback)
    {
        callback(ba);

        loadValidDic[loader] = null;

        delete loadValidDic[loader];
    }
}

用于时间轴

function loadfile(e:MouseEvent):void
{
     LoaderToObject.loadBin("chick.bmp", onComplete);//send file to URLLoader
}

private function onComplete(imageBytes:ByteArray):void
{
    MakeImage2(imageBytes);
}