2011-01-20 50 views
0

我的項目是我需要等待後臺操作才能完成的地方。到那時,會顯示一個進度對話框。現在,操作完成後,結果將存儲在List中並且應該創建一個列表。等待給我一個Android錯誤

似乎一切都工作正常(進度對話框和所有),但在等待(),我的代碼(在堆棧溢出看到的)是

Runnable runnable = new Runnable() { 
    public void run() { 
     // wait(); This call wouldn't work 
     synchronized (this) { 
     wait(); // This call will work 
     } 
    } 
}; 

,並完成了後臺操作後,它是

public void handleMessage(android.os.Message msg) { 
      super.handleMessage(msg); 
      System.out.println("Doneee!!! Yup yes "); 
      pd.dismiss(); 
     synchronized (runnable) { 
     runnable.notifyAll(); // this call will work 
     } 
    } 

但問題是,等待被吊死。我的意思是,當我嘗試調試也wait()不返回。它只處於等待狀態。所以你可以幫我出去做!

非常感謝!

問候 尼西

+0

你真的需要一個同步塊嗎? – gulbrandr 2011-01-20 18:07:40

+0

我試過刪除同步聲明。它給出了一個錯誤,在等待之前對象沒有被鎖定 – nithinreddy 2011-01-21 09:46:16

回答

0

如果要顯示一個進度對話框,然後;希望你從後臺進程發送進度通知到進度對話框,以便「進度對話框」不是「我是一個傻子,所以我實際上不會顯示進度」對話框。後臺進程發送「我已完成」通知。

0

等待需要同步以避免您看到的問題。解決您的問題的方法是使用標誌以及wait()和notify()調用。同步等待操作完成應該是這個樣子:

boolean done = false; 

... 

synchronized(this) { 
    if (!done) wait(); 
} 

... 
synchronized(this) { 
    done = true; 
    notifyAll(); 
} 

如果沒有標誌,則有可能爲notifyAll的()被調用之前 wait()的是,在這點你最終等到永遠。需要同步的塊來確保在檢查完成和調用wait()之間不發生通知。 Java對象如果不存在的原因是因爲語言設計者試圖巧妙地提醒你這種系統通常是必需的。

編輯添加:在Android中,對於大多數用途而言,AsyncTask類完全沒有這種做法的麻煩。儘可能使用它。