我讀過android中的主UI線程不應該調用sleep。UI線程等待其他線程執行 - 不能正常工作
然而,我的應用程序需要:
- 調用線程1從主UI線程從主UI線程
- 調用線程2。
使用2個線程的輸出(2個圖像),添加它們然後顯示它們。
我正在使用Thread.sleep(),以便主線程等待它們完成後等待線程1和線程2。然而mImageview.setbitmap不工作後,我在主線程(睡眠後)調用它。
你能告訴我應該怎麼做嗎?
我讀過android中的主UI線程不應該調用sleep。UI線程等待其他線程執行 - 不能正常工作
然而,我的應用程序需要:
使用2個線程的輸出(2個圖像),添加它們然後顯示它們。
我正在使用Thread.sleep(),以便主線程等待它們完成後等待線程1和線程2。然而mImageview.setbitmap不工作後,我在主線程(睡眠後)調用它。
你能告訴我應該怎麼做嗎?
Android中的多線程應該異步完成。爲此,您應該使用AsyncTask
-class。
對於你的情況,你會例如創建一個taks來加載(或處理)這兩個圖像。當進程正在運行時(在另一個線程中,關閉UI線程),您可以顯示一個ProgressBar
,向用戶顯示您的應用程序當前正在忙碌(然後在UI線程上完成此操作)。
任務完成後,您會從任務中獲得結果(您的兩張圖像),隱藏進度條並向用戶顯示所有內容。儘管事實上沒有反應的GUI總會有應用程序凍結的感覺,但如果一個UI線程被阻塞超過5秒(這是一個looong時間),你的應用程序將被強制關閉爲它不是「反應」(並且將提出ANR)。
它不只是Thread.Sleep()。在GUI線程中,執行所需的任何操作來啓動兩個線程/任務/任何內容,然後退出事件處理程序。
不要在GUI事件處理程序中等待!不在Java,C++,C,Delphi中,任何東西。使用異步任務或處理程序,並向GUI線程發送信號。線程1表示完成,線程2表示完成。在任何一種情況下,檢查數據是否已由其他線程返回。如果有,則有兩組返回的數據,因此可以添加並顯示它們。
不要在GUI事件處理程序中等待。
您可以簡單地使用線程和處理程序來達到此目的。 下面是這個小演示,
在你的onCreate這樣創建處理器,
Drawable d=null;
Handler handler=new Handler()
{
public void handleMesaage(Message msg)
{
if(msg.what==0)
{
imageView.setBackgroundDrawable(d);
}
}
};
現在叫你的主題這樣,
Thread t=new Thread(new Runnable()
{
@Override
public void run() {
InputStream is = (InputStream) new URL(url).getContent();
d = Drawable.createFromStream(is, "src name");
handler.sendEmptyMessage(0);
}
});t.start();
我會建議使用ExecutorService。以下是如何運行
ExecutorService.awaitTermination()
;讓主線程等待Runnable任務完成。它的文檔讀取阻塞,直到所有任務都已關閉 請求後完成執行,或發生超時或者當前線程中斷, 先發生者爲準。
這是異步的方式,我猜應該是首選。
等待在一個事件處理程序正在與'我的浮點數比較失敗'和'我怎樣才能阻止我的線程? :( – 2012-04-10 11:02:56
另一件事 - 如果圖形用戶界面被阻止,就不會有'取消操作'按鈕,當用戶無法阻止他們錯誤地啓動的東西時,它令人難以置信的令人沮喪和惱人。 '。 – 2012-04-10 11:06:24
@MartinJames你可以取消一個'AsyncTask',這可以通過按鈕或者「後退」鍵實現。 – 2012-04-10 11:17:15