Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查对话框是否可以安全地关闭_Java_Android - Fatal编程技术网

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

Java 检查对话框是否可以安全地关闭,java,android,Java,Android,在我的应用程序中,我正在长时间运行的后台进程中显示一个对话框,该进程是模态的。 当android从后台任务返回时,此对话框被取消 final ProgressDialog progressDialog = ProgressDialog.show(activity, "", "Doing something long running", true, true); new Thread(new Runnable() { public void run() { someLon

在我的应用程序中,我正在长时间运行的后台进程中显示一个对话框,该进程是模态的。
当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

有没有办法检查关闭对话框是否安全

编辑:或者更好,是否有任何方法将现有对话框附加到新创建的活动?

新的克隆对话框也可以。

只需捕获异常并忽略它即可。Android决定在轮换时重新启动活动,这使得线程有一些类似的异常。但最终结果是没有显示任何对话框。如果只是捕获异常,则不会显示任何对话框。所以你很好

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

如果您没有为横向和纵向使用单独的布局/绘图功能,您只需覆盖活动清单中的configChange,这样它就不会破坏活动(它仍将为您正确旋转和调整所有内容的大小)。这样就会出现相同的对话框,您不应该出现异常。另一个选项需要在saveInstanceState和onRestoreInstanceState上做大量工作,如果线程在这段时间内实际完成,则需要非常小心计时问题。整个“在旋转时重新创建活动”的想法在多线程中不起作用。

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

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

显然,progressDialog即使在与窗口分离时也不为null。否则我会得到一个NPE,对吗?事实上,对我来说最好的解决方案是,如果有任何方法将现有对话框附加到新创建的活动,因为任务可能仍在运行。有办法吗?还更新了我的问题以反映这一点。如果您没有为横向和纵向使用单独的布局/绘图,您只需覆盖活动清单中的configChange,这样它就不会破坏活动(它仍将为您正确旋转和调整所有内容的大小)。另一个选项需要在saveInstanceState和onRestoreInstanceState上进行大量工作,如果线程在这段时间内实际完成,则需要非常小心时间问题。这是一个政治问题——他们组织中认为轮换娱乐非常酷的人不喜欢这种方法。同时,他们的大多数应用程序(除了最琐碎的应用程序)都使用它,包括浏览器、gmail等。然而,他们首选的方式在多线程方面效果不佳,几乎无法使用。请随意发布这些有见地的信息作为答案,我很乐意接受。