有許多問題涉及缺乏解僱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。
必須有一些特殊情況,使我失去了我進度對話框的鏈接,而我打消的對話可能不是正在顯示的對話框,但我想不出如何可能。有任何想法嗎?
您曾經說過,您的處理程序正在做出響應,但未對UI進行任何更改。是否可以開始一個新的處理程序,但是嘗試從之前使用的處理程序進行更改?也許你可能會把處理器的一些功能從圖形變成runOnUiThread(Runnable) – 2011-12-04 23:23:31
@MovieovBoris:RefreshView可能不是我選擇的最好的名字。 RefreshViewRunnable只是再次下載頁面的數據,Handler用新數據更新視圖。這工作正常,我相信意味着處理程序必須在UI線程中。這只是它也試圖解僱progressDialog,並且失敗了。 – AlbeyAmakiir