2012-06-07 154 views
1

這是主線程中的處理程序,它顯示和取消進度對話框。未顯示Android進度對話框

public static final int SHOW = 0; 
public static final int DISMISS = 1; 
public Handler pdHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     Log.i(TAG, "+ handleMessage(msg:" + msg + ")"); 
     switch(msg.what) { 
     case SHOW: 
      pd = ProgressDialog.show(LogViewer.this, "", getText(R.string.loading_msg), true); 
      break; 
     case DISMISS: 
      if(pd != null) { 
       pd.dismiss(); 
       pd = null; 
      } 
      break; 
     } 
    } 
}; 

顯示進度的消息是:

 pdHandler.sendMessage(pdHandler.obtainMessage(SHOW)); 

消息解僱是:

 pdHandler.sendMessage(pdHandler.obtainMessage(DISMISS)); 

它運作良好,當我打電話之前,我啓動的AsyncTask時, AsyncTask onPostExecute()將其解除。

但是當它運行在runnable(runOnUiThread)中時,對話框不顯示。在調試器上檢查 pd變量,它顯示它已創建,正在運行並且可見,但實際上它不可見。

有什麼建議嗎?

更新:
我做了明顯的測試,我應該做的第一個地方。我評論了DISMISS消息。進度對話框顯示出來。在可運行結束後,它顯得太晚了。
我現在不知道該DISMISS消息確實否定了不可見的ProgressDialog,這就是爲什麼我沒有看到它。
現在的問題是:我需要ProgressDialog在可執行代碼執行之前顯示。它並不那麼直截了當。我調用層次是這樣的:

onScrollEventChanged 
    --> runOnUiThread ( 
     --> checkScrollLimits 
      --> if need to scroll 
       show ProgressDialog "Loading" 
       get new data into table 
       dismiss ProgressDIalog 
    ) 

我想是這樣的:

onScrollEventChanged 
    --> checkScrollLimits 
     --> if need to scroll 
      show ProgressDialog "Loading" 
      --> runOnUiThread ( 
       get new data into table 
       dismiss ProgressDIalog 
      ) 

不過還是解除消息到達那裏之前,ProgressDialog可以顯示。

根據Logcat,SHOW消息的到達和DISMISS消息的到達之間有5秒的間隔。

UPDATE II:
不過,我覺得我會用ProgressDIalog

pd = ProgressDialog.show(...) 
while(!pd.isShowing()); 

的isShowing()方法,但它並不能幫助所有,它返回true,即使對話沒有顯示呢。

回答

0

我把它轉動代碼到的AsyncTask和使用try/catch塊工作。

見我在this post

答案,我不知道,如果是的AsyncTask必要的,但之後,我曾經有過,的try/catch塊製成的差異。

2

也許你不應該通過Looper.prepare()功能使用runOnUiThread()和更好的處理這個問題:

What is the purpose of Looper and how to use it?

而且你AsyncTask完成並運行在onPostExecute()那麼你是在UI線程使一個附加runOnUiThread()是不必要。

+0

謝謝,我會考慮使用活套。 :::: AsyncTask是處理程序按預期執行的示例。我沒有在AsyncTask上運行runOnUiThread。 runnable與應用程序中的其他代碼相關,我需要提供相同的ProgressDialog,我使用的是runOnUiThread。 – ilomambo

0

我認爲它不會work.The從正在發送消息

pdHandler.sendMessage(pdHandler廣場。obtainMessage(DISMISS));

你需要把所有那些沉重的聲明或工作放到另一個非ui線程中。處理程序用於將消息放入線程消息隊列中,如果線程繁忙,則會在之前的消息傳遞後執行該消息。因爲你的UI很繁重,對話框沒有更新。始終爲您的後臺工作使用服務。切勿嘗試將所有內容都放在UI線程中。

希望它會幫助你,否則使用AsyncTask這是做這種事情的最佳方法。如果仍然面臨同樣的問題,那麼將該代碼從發送消息的位置發送到處理程序。