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等。然而,他们首选的方式在多线程方面效果不佳,几乎无法使用。请随意发布这些有见地的信息作为答案,我很乐意接受。