有许多问题涉及缺乏解雇ProgressDialog的能力,但它们似乎都不能解决我的情况。
我有一个运行Runnable对象的Thread,当它完成时,会向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,则在Thread中启动不同的ProgressDialog(refreshViewDialog)和Runnable(refreshViewRunnable)。但是,当调用Handler(refreshViewHandler)时,它无法关闭对话框。但它 记录Progress dialog is dismissed
。
这个特别奇怪,因为当Activity启动时也会运行refreshViewsRunnable,但它可以摆脱对话框,就好了。上面的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的链接,而我正在解雇的对话框可能不是显示的对话框,但我想不出那是怎么回事。有什么想法吗?
答案 0 :(得分:0)
我的猜测是这是一个上下文/处理程序问题。我有类似的问题,并决定使用接口/回调而不是Handler,它解决了我的问题。
但是,您可以尝试以下操作,您会看到以下内容:>>但它确实记录了进度对话框。<< ,添加:
MyActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
progressDialog.dismiss();
}
});