【问题标题】:Why is the ProgressDialog not being dismissed, in this case?在这种情况下,为什么 ProgressDialog 没有被解除?
【发布时间】: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,但失败了。

标签: android progressdialog


【解决方案1】:

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

但是,您可以尝试以下操作,您会看到:>> 但它确实会记录进度对话框已关闭。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2013-04-23
    相关资源
    最近更新 更多