有许多问题涉及缺乏解雇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