【问题标题】:Check if dialog can be safely dismissed检查是否可以安全地关闭对话框
【发布时间】:2013-07-28 14:13:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: java android


    【解决方案1】:

    只需捕获异常并忽略它。 Android 决定重启 Activity 的循环使得线程有一些奇怪的例外。但是您想要的最终结果是没有显示对话框。如果您只是捕获异常,则不会显示任何对话框。所以你很好。

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

    【讨论】:

    • 实际上,对我来说最好的解决方案是如果有任何方法可以将现有对话框附加到新创建的活动,因为该任务可能仍在运行。有没有办法做到这一点?还更新了我的问题以反映这一点。
    • 如果您没有为横向和纵向使用单独的布局/drawables,您可以在您的清单中为活动覆盖 configChange,这样它就不会破坏活动(它仍然会正确旋转和为您调整所有内容)。另一个选项需要围绕 onSaveInstanceState 和 onRestoreInstanceState 进行大量工作,如果线程在此期间实际完成,您需要非常小心时间问题。
    • 它的政治性 - 他们组织中认为轮换娱乐真的很酷的人不喜欢这种方法。同时,他们的大多数应用程序(除了最琐碎的应用程序)都使用它,包括浏览器、gmail 等。但是他们首选的方式不适用于多线程,以至于几乎无法使用。
    • 随时发布这些有见地的信息作为答案,我很乐意接受。
    【解决方案2】:
    if (progressDialog != null) {
        progressDialog.dismiss();
    }
    

    【讨论】:

    • 显然,progressDialog 不为空,即使与窗口分离。否则我会得到 NPE,对吧?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-30
      • 2011-05-21
      • 1970-01-01
      • 2017-01-24
      • 2018-11-18
      • 2015-04-17
      • 1970-01-01
      • 2015-07-09
      • 2010-09-30
      相关资源
      最近更新 更多