2011-12-04 130 views
0

有許多問題涉及缺乏解僱ProgressDialog的能力,但他們都沒有涉及我的情況。爲什麼ProgressDialog在這種情況下不會被解僱?

我有一個線程運行一個Runnable對象,當它完成時,將消息發送到Handler對象,我確定它與ProgressDialog坐在同一個線程上。處理程序執行此操作:

if(progressDialog != null){ 
    Log.w(TAG, "Progress dialog is dismissed"); 
    progressDialog.dismiss(); 
}else{ 
    Log.w(TAG, "Progress dialog is null"); 
} 

我已經完成了這一百萬次之前,它的工作。 ProgressDialog消失。但是,在一個特定的情況下,它沒有。

在這種特殊情況下,顯示一個ProgressDialog(我們將調用uploadChangesDialog),然後調用一個特定的Handler(uploadChangesHandler)。關閉uploadChangesDialog後,它會檢查如果爲true,則會在線程中啓動不同的ProgressDialog(refreshViewDialog)和Runnable(refreshViewRunnable)。但是,當Handler被調用(refreshViewHandler)時,它不能關閉對話框。但它確實日誌Progress dialog is dismissed

這特別奇怪,因爲refreshViewsRunnable也是在Activity啓動時運行的,但它可以擺脫對話框,那就好了。上面的progressDialog變量是它唯一的類型,它應該包含任何ProgressDialog當前顯示的內容。

我以前用AlertDialogs做過這件事,但他們知道如何關閉自己,所以如果我做錯了什麼,那我就不會注意到了。

在onCreateDialog()方法:

case DIALOG_REFRESH_VIEW: 
    progressDialog = new ProgressDialog(this); 
    progressDialog.setMessage("Loading details..."); 
    progressDialog.setCancelable(false); 
    return progressDialog; 

複製爲每個實例,具有不同的消息。我確實將它更改爲指向相同代碼的所有對話框,並在onPrepareDialog()中設置消息,但這並未改變任何行爲。

在UploadChangesRunnable:

public void run(){ 
    int result = 0; 
    if(uploadChanges()){ 
     result = 1; 
    } 
    uploadChangesHandler.sendEmptyMessage(result); 
} 

然後在uploadChangesHandler:

public void handleMessage(Message msg){ 
    if(progressDialog != null){ 
     progressDialog.dismiss(); 
    } 
    if(msg.what == 0){ 
     showDialog(DIALOG_UPLOAD_CHANGES_FAILED); //This is an AlertDialog 
    }else{ 
     //All this does is showDialog(DIALOG_REFRESH_VIEW) then run the thread. 
     //This method is in the enclosing Activity class. 
     refreshViewInThread(); 
    } 
} 

最後,refreshViewInThread方法:

private void refreshViewInThread(){ 
    showDialog(DIALOG_REFRESH_VIEW); 
    Thread thread = new Thread(new RefreshViewRunnable(refreshViewHandler)); 
    thread.start(); 
} 

而RefreshViewRunnable看起來非常類似於UploadChangesRunnable。

必須有一些特殊情況,使我失去了我進度對話框的鏈接,而我打消的對話可能不是正在顯示的對話框,但我想不出如何可能。有任何想法嗎?

+0

您曾經說過,您的處理程序正在做出響應,但未對UI進行任何更改。是否可以開始一個新的處理程序,但是嘗試從之前使用的處理程序進行更改?也許你可能會把處理器的一些功能從圖形變成runOnUiThread(Runnable) – 2011-12-04 23:23:31

+0

@MovieovBoris:RefreshView可能不是我選擇的最好的名字。 RefreshViewRunnable只是再次下載頁面的數據,Handler用新數據更新視圖。這工作正常,我相信意味着處理程序必須在UI線程中。這只是它也試圖解僱progressDialog,並且失敗了。 – AlbeyAmakiir

回答

0

我的猜測是這是一個上下文/處理程序問題。我有類似的問題,並決定使用接口/回調,而不是處理程序,它解決了我的問題。

但是,您可以嘗試以下操作,看到以下內容:>>但它會記錄「進度」對話框已被取消。 < <,add:

MyActivity.this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     progressDialog.dismiss(); 
     } 
    }); 
相關問題