2011-06-09 177 views
1

我正在開發一個遊戲,即在單獨的線程中運行。現在我需要從互聯網下載圖像。我爲此寫了一個AsyncTask類,但我無法弄清楚如何從我的遊戲線程中正確調用它。實際上,我的AsyncTask處於阻止狀態,但在下載圖像之前需要等待。如果我使用runOnUIThread,它不會阻止我的線程,並進一步,這根本不適合我。我試過在運行AsyncTask之前也使用Looper.prepare(),但是這也有一些麻煩:Looper.myLooper().quit()似乎沒有工作,並且如果我嘗試再次撥打AsyncTask,我得到一個異常告訴我,我試圖第二次致電Looper.prepare()。 我應該如何繼續?提前致謝。如何從一個單獨的線程正確調用AsyncTask?

回答

1

如果您的後臺線程無論如何都會阻塞,您不需要AsyncTask,並且可以直接在此線程中進行圖像加載。之後要在UI線程上發佈,您需要設置Handler並設置彎道。一種選擇是傳遞在UI線程中創建的處理程序。另一種選擇是一些背景傳遞給你的後臺線程並做

Handler h = new Handler(context.getMainLooper()); 

如果圖像加載過程中需要一些最新進展,你可以使用的AsyncTask並按照上述方法使用創建的處理程序。

1

如果你的遊戲線程不是你的主線程,也就是說,如果它不是UI線程,則從你的遊戲線程調用處理程序。現在從這個處理程序調用你的異步任務。

只需調用這樣的東西。

hm.sendEmptyMessage(0); 

Handler hm = new Handler(){ 


public void handleMessage(Message msg) 
{ 
//call async task. 
} 

}; 

謝謝。

+0

另一個問題是我的遊戲包含兩項活動:主要活動和遊戲活動。我通過startActivity()開始我的遊戲活動,然後啓動它的單獨線程。現在,第一個活動無法從遊戲活動訪問,所以我無法訪問在此處創建的處理程序。我該怎麼辦? – Egor 2011-06-09 08:19:18

+0

創建主要活動的靜態實例。說 公共靜態MainActivity mainactivity; oncreate(){ mainactivity = this; } 現在使用這個instance.getHandler()。sendEmptyMessage(0); – 2011-06-09 10:53:10