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

Pur*_*der 5 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();
Run Code Online (Sandbox Code Playgroud)

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

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

Gab*_*han 3

只需捕获异常并忽略它即可。Android 决定轮流重新启动 Activity,这使得线程出现一些类似的奇怪异常。但您想要的最终结果是不显示对话框。如果您只是捕获异常,则不会显示任何对话框。所以你很好。

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