在这种情况下,为什么ProgressDialog不会被解雇?

时间:2011-12-04 22:28:43

标签: android progressdialog

有许多问题涉及缺乏解雇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的链接,而我正在解雇的对话框可能不是显示的对话框,但我想不出那是怎么回事。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我的猜测是这是一个上下文/处理程序问题。我有类似的问题,并决定使用接口/回调而不是Handler,它解决了我的问题。

但是,您可以尝试以下操作,您会看到以下内容:>>但它确实记录了进度对话框。<< ,添加:

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