检查是否可以安全地关闭对话框

时间:2013-07-28 14:13:40

标签: java android

在我的应用程序中,我在长时间运行的后台进程中显示一个对话框,这是一个模态 当android从后台任务返回时,该对话框被解除。

final ProgressDialog progressDialog = ProgressDialog.show(activity, "", "Doing something long running", true, true);

new Thread(new Runnable() {
    public void run() {
        someLongRunningCode(); // (not using AsyncTask!)

        activity.runOnUiThread(new Runnable() {
            public void run() {
                progressDialog.dismiss();
            }
        });
    }
}).start();

但是,现在,当用户在后台进程仍在运行时旋转其设备时,将重新创建活动,因此,progressdialog将从活动中分离出来。
当长时间运行的过程完成后,android显然会尝试隐藏(现在已分离的)进度对话框,然后导致异常:java.lang.IllegalArgumentException: View not attached to window manager
有没有办法检查是否可以安全地关闭对话框?

编辑:或者更好的是,有没有办法将现有的对话框附加到新创建的活动中? 一个新的,克隆的对话框也没问题。

3 个答案:

答案 0 :(得分:3)

抓住异常并忽略它。 Android决定在轮换时重新启动活动会使线程有一些奇怪的例外情况。但是你想要的最终结果是没有显示对话框。如果您只是捕获异常,则不会显示任何对话框。所以你很好。

如果您没有为横向和纵向使用单独的布局/绘图,则可以在清单中覆盖活动中的configChange,这样它就不会破坏活动(它仍会正确旋转并为您调整所有内容) 。这样,同一个对话框就会出现,你不应该得到异常。另一个选项需要在onSaveInstanceState和onRestoreInstanceState上进行大量的工作,如果线程在此期间实际完成,则需要非常小心时序问题。关于旋转思想的整个重新创建活动不适用于多线程。

答案 1 :(得分:0)

if (progressDialog != null) {
    progressDialog.dismiss();
}

答案 2 :(得分:0)

我以前遇到过这个问题,并使用下面的代码解决了。

private boolean isDialogViewAttachedToWindowManager() {
    if (dialog.getWindow() == null) return false;
    View decorView = progressDialog.getWindow().getDecorView();
    return decorView != null && decorView.getParent() != null;
}