2012-06-03 77 views
0

所以我一直在試圖做這樣的事情在AS3以下加載任何圖像,並在運行時檢索其位圖數據後:等待繼續代碼,直到Loader.load方法()完成加載

var bitmapData:BitmapData; 
var loader:Loader; 
var completed:Boolean = false; 

public function loadBitData(path:String):BitmapData{ 
    loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); 
    loader.load(new URLRequest(path)); 
    while(!completed){ 

    } 
    completed = false; 
    return bitmapData; 
} 


private function onComplete (event:Event):void{ 
    bitmapData = Bitmap(LoaderInfo(event.target).content).bitmapData; 
    completed = true; 
} 

由於加載器不會在單獨的線程上加載文件,這段代碼顯然會陷入無限循環。如果刪除while循環,則該方法將返回null,因爲到達該語句時數據尚未加載。然而,它仍然會加載數據。 (我已經使用進度事件檢查了這一點,並且打印了迄今爲止已加載的數據量)

我只是想要該方法加載文件,然後在完全加載後返回BitmapData。程序應該等待,不要執行任何更多的代碼,直到發生這種情況。任何幫助,將不勝感激。

+0

您不能將異步函數轉換爲同步函數。在完成事件中加載數據之後,讓代碼運行。 –

回答

1

不,程序不應該等到圖像加載完畢。加載數據是異步完成的。

在編程中,異步事件是獨立於主程序流而發生的事件。異步操作是在非阻塞方案中執行的操作,允許主程序流繼續處理。

當外部數據加載時,您的應用程序將繼續正常運行。您的onComplete()方法是您需要管理數據完全加載後應該發生的情況的方法。如果您不想在此之前發生任何事情,請將該代碼移到onComplete處理程序中。

+0

但是,如果我不想在加載器完成之前發生的事情是整個程序的其餘部分呢?我想在之前沒有使用它的程序中使用loader類。我寧願不重構整個事物,以便它可以與這個類一起工作。 – android927

+0

@ android927這是一個非常標準的情況,你可以這麼做 - 改變你的應用程序,以便在所有的依賴加載(或加載失敗)之後開始。 – Marty

+0

我一直希望保持程序的結構不變,並讓每個對象加載它自己的資產,但那些依賴於這些對象的事物會有一個有效的非空DisplayObject中斷,因爲它還沒有完成加載。在繼續之前等待加載完成是我使用過的每個其他API(XNA,Slick2D)的標準行爲。爲什麼這個功能在actionscript中不可用? – android927

0
  1. 如果要使用LoaderMax - 剛開始加載後,您將獲得固定尺寸特殊的顯示對象,當正確的圖像將加載會自動更新。如果您需要在實際加載之前在圖像大小的舞臺上放置一個位置,那麼這可能會解決您的問題。

  2. 如果您確實需要在沒有第三方工具的情況下處理此問題,或者您需要使用其他工具,只需在數據加載時發送自定義事件,然後讓應用程序響應即可。只有這一個功能你不能處理這個問題。這是異步的事情,所以你需要有適當的架構。嘗試重新設計事件。

+0

您不需要分派自定義事件;有一個內置的... – Marty

+1

當然,他也可以使用它,這取決於整個應用程序的體系結構。我只是習慣於使用附帶數據的自定義事件:)。 –

+0

確實,擁有自己的事件確實可以增加「BitmapData」作爲事件的屬性,從而消除了COMPLETE處理程序中的一個步驟。 – Marty

相關問題