2012-04-10 39 views
0

我讀過android中的主UI線程不應該調用sleep。UI線程等待其他線程執行 - 不能正常工作

然而,我的應用程序需要:

  1. 調用線程1從主UI線程從主UI線程
  2. 調用線程2。

使用2個線程的輸出(2個圖像),添加它們然後顯示它們。

我正在使用Thread.sleep(),以便主線程等待它們完成後等待線程1和線程2。然而mImageview.setbitmap不工作後,我在主線程(睡眠後)調用它。

你能告訴我應該怎麼做嗎?

回答

1

Android中的多線程應該異步完成。爲此,您應該使用AsyncTask-class

對於你的情況,你會例如創建一個taks來加載(或處理)這兩個圖像。當進程正在運行時(在另一個線程中,關閉UI線程),您可以顯示一個ProgressBar,向用戶顯示您的應用程序當前正在忙碌(然後在UI線程上完成此操作)。

任務完成後,您會從任務中獲得結果(您的兩張圖像),隱藏進度條並向用戶顯示所有內容。儘管事實上沒有反應的GUI總會有應用程序凍結的感覺,但如果一個UI線程被阻塞超過5秒(這是一個looong時間),你的應用程序將被強制關閉爲它不是「反應」(並且將提出ANR)。

+0

等待在一個事件處理程序正在與'我的浮點數比較失敗'和'我怎樣才能阻止我的線程? :( – 2012-04-10 11:02:56

+0

另一件事 - 如果圖形用戶界面被阻止,就不會有'取消操作'按鈕,當用戶無法阻止他們錯誤地啓動的東西時,它令人難以置信的令人沮喪和惱人。 '。 – 2012-04-10 11:06:24

+0

@MartinJames你可以取消一個'AsyncTask',這可以通過按鈕或者「後退」鍵實現。 – 2012-04-10 11:17:15

0

它不只是Thread.Sleep()。在GUI線程中,執行所需的任何操作來啓動兩個線程/任務/任何內容,然後退出事件處理程序。

不要在GUI事件處理程序中等待!不在Java,C++,C,Delphi中,任何東西。使用異步任務或處理程序,並向GUI線程發送信號。線程1表示完成,線程2表示完成。在任何一種情況下,檢查數據是否已由其他線程返回。如果有,則有兩組返回的數據,因此可以添加並顯示它們。

不要在GUI事件處理程序中等待。

0

您可以簡單地使用線程和處理程序來達到此目的。 下面是這個小演示,

在你的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(); 
0

我會建議使用ExecutorService。以下是如何運行

  1. 將兩個圖像加載活動創建爲可運行任務。
  2. 使用ExecutorService執行它們。
  3. 使用ExecutorService.awaitTermination();讓主線程等待Runnable任務完成。它的文檔讀取

阻塞,直到所有任務都已關閉 請求後完成執行,或發生超時或者當前線程中斷, 先發生者爲準。

這是異步的方式,我猜應該是首選。