【发布时间】:2014-05-08 17:56:25
【问题描述】:
有许多问题涉及无法关闭 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),然后调用一个特定的处理程序(uploadChangesHandler)。关闭 uploadChangesDialog 后,它会检查是否在线程中启动不同的 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 非常相似。
一定有一些特殊情况让我失去了我的progressDialog的链接,我正在关闭的对话框可能不是正在显示的对话框,但我想不出这是怎么回事。有什么想法吗?
【问题讨论】:
-
您曾说过您的处理程序正在响应,但没有对 UI 进行任何更改。是不是您启动了一个新的处理程序,但尝试对以前使用的处理程序进行更改?也许您可以将一些对图形进行更改的处理程序中的功能移动到 runOnUiThread(Runnable)
-
@MocialovBoris:RefreshView 可能不是我选择的最佳名称。 RefreshViewRunnable 只是再次下载页面的数据,而 Handler 使用新数据更新视图。这很好用,我相信这意味着处理程序必须在 UI 线程中。只是它也试图关闭progressDialog,但失败了。