一个Bug
前几日出现这样一个Bug是一个RuntimeException,详细信息是这样子的:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:356)
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:201)
at android.view.Window$LocalWindowManager.removeView(Window.java:400)
at android.app.Dialog.dismissDialog(Dialog.java:268)
at android.app.Dialog.access$000(Dialog.java:69)
at android.app.Dialog$1.run(Dialog.java:103)
at android.app.Dialog.dismiss(Dialog.java:252)
at xxx.onPostExecute(xxx$1.java:xxx)
首先是Google了下,发现引发这个的原因基本上都一致都是Dismiss对话框的时候,Activity已经不再存在。常发生这类Exception的情形都是,有一个费时的线程操作,需要在显示一个ProgressDialog,在任务开始的时候显示一个对话框,然后当任务完成了再Dismiss对话框,如果在此期间如果Activity因为某种原因被杀掉且又重新启动了,那么当Dismiss的时候WindowManager检查发现Dialog所属的Activity已经不存在了,所以会报IllegalArgumentException: View not attached to window manager.
其实此类Exception的一重要的原因是,ProgressDialog的创建显示和取消都允许在非UI线程中进程。在Android当中非UI线程是不允许操作UI相关的事情,比如添加移除View等,但是为会么允许创建显示和取消对话框呢?而且还有可能引发此Exception导致应用Crash。
要想避免此类Exception,就要正确的使用对话框,也要正确的使用线程。
正确的使用对话框
不要在非UI线程中使用对话框创建,显示和取消对话框。
那么对于异步操作显示对话框怎么办呢?Activity都有相应的操作对话框的回调比如onCreateDialog(),showDialog(),dimissDialog(),removeDialog()等等。这些因为都是Activity的方法,所以用起来更方便,也不用显示创建和操控Dialog对象,一切都由框架操控,相对来说比较安全。
另外就是一定要让对话框对象在Activity的可控制范围之内和生命周期之内,比如一定要是它的成员变量,并且在让对话框变量活跃在Activity的onCreate()和onDestroy()之间。
正确的使用线程 www.2cto.com
尽量少用单独线程,除非是真正的费时操作才用线程,线程也不要直接用Java式的匿名线程,除非是那种单纯的操作,操作完成后不需要做其他事情的。
尽可能多用Android提供的类比如AsyncTask等。另外如果线程操作过程中还需要与主线程有交互,那么最好保存一个线程的对象,并且线程内部最有一定的控制,这样可以让Activity更好的操控线程。
如果说某些操作是特别费时的,且是经常性的操作,比如从网络获取数据,或是从后台读取文件,或是导入/导出,恢复/备份的事情,最好放到后台Service中去做,然后在StatusBar中给出相应进度。
摘自 浪人的星空
最简单的方法
@Override
protected void onDestroy() {
if(pDialog.isShowing()){
pDialog.cancel();
}
super.onDestroy();
}
分享到:
相关推荐
如果你想创建一个完全自定义样式的Dialog,可以创建一个新的主题并在`styles.xml`文件中定义: ```xml <style name="CustomDialogTheme" parent="Theme.AppCompat.Light.Dialog"> <item name="colorPrimary">@...
例如,使用`AlertDialog.Builder`创建一个简单的Dialog: ```java AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("标题") .setMessage("内容") .setPositiveButton("确定",...
2. **创建自定义Dialog**:创建一个继承自`android.app.Dialog`的自定义Dialog类,以便我们可以在其中添加自定义布局。例如,可以创建一个名为`MyLoadingDialog`的类: ```java public class MyLoadingDialog ...
本教程将详细讲解如何创建一个全屏显示且带有动画效果的自定义Dialog,并结合相机和图片选择的使用场景进行演示。 首先,我们需要了解Android Dialog的基础知识。Dialog是Android系统提供的一种轻量级窗口,通常...
创建一个自定义Dialog通常涉及以下步骤: 1. 创建一个继承自`AppCompatDialogFragment`的类,重写`onCreateDialog()`方法来设置Dialog的样式和内容。 2. 在`onCreateDialog()`中,使用`AlertDialog.Builder`来构建...
- 创建自定义样式:在`res/values/styles.xml`文件中创建一个新的Dialog主题,比如`Theme.Translucent.Dialog`,并在其中设置`android:background="@android:color/transparent"`,使得Dialog背景变为透明。...
本文将详细讲解如何实现一个带有动画效果的底部弹出Dialog,并通过具体的代码实例进行演示。 首先,我们需要创建一个自定义的Dialog布局文件。这个布局通常包含一个根布局(如LinearLayout或ConstraintLayout),...
通常,当我们使用AlertDialog构建一个对话框时,它的默认行为是在用户点击按钮(如"确定"或"取消")后自动关闭。然而,在某些特定场景下,我们可能希望在用户触发某个操作(如输入验证失败)时保持Dialog不关闭,...
各种android弹出dialog效果以及各种dialog样式各种android弹出dialog效果以及各种dialog样式各种android弹出dialog效果以及各种dialog样式各种android弹出dialog效果以及各种dialog样式各种android弹出dialog效果...
在Android开发中 我们经常会需要在Android界面上弹出一些对话框 比如询问用户或者让用户选择 关于Android Dialog的使用方法 已经有很多blog做出了详细的介绍(比如博客:7种形式的Android Dialog使用举例) 但是只是...
首先,我们需要创建一个XML布局文件,该文件将定义Dialog中的控件及其样式。示例代码如下: ```xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=...
本示例是关于如何创建一个具有多选功能的Dialog,结合了Dialog、ListView和CheckBox的使用。下面将详细介绍这个自定义Dialog的实现过程。 首先,我们需要一个Dialog来承载我们的UI。在Android中,Dialog通常通过...
在Android中,我们可以使用AlertDialog.Builder来创建一个单选对话框。首先,我们需要创建一个包含所有选项的数组或List,并通过setSingleChoiceItems()方法将它们添加到Builder中。然后,设置一个...
在Android开发中,有时我们需要创建一个对话框(Dialog)来展示一些信息或者提供用户交互,例如选择、设置等。在这种情况下,如果对话框中的内容需要包含列表数据,我们就会使用到`Dialog`嵌套`ListView`的技术。这...
在上述代码中,我们加载了一个名为`dialog_password`的XML布局文件,该文件定义了EditText和自定义图标的布局。通过`findViewById`方法找到对应的视图元素,然后设置`TextWatcher`监听EditText中的文本变化。在`...
- AlertDialog:这是最常见的Dialog类型,它可以包含一个标题、一个消息、一个或多个按钮。通过AlertDialog.Builder类创建,可以设置图标、标题、消息和按钮。 - ProgressDialog:用于显示进度条,通常在执行耗时...
在Android开发中,Dialog是一种非常重要的用户界面组件,它用于在主应用程序界面之上显示一个临时窗口,用于向用户展示信息、询问确认或者提供选项。在本文中,我们将深入探讨如何在Android应用中有效地使用Dialog。...
本教程将深入探讨如何在Android 7.0系统上实现一个简单的单图片选择功能,通过一个对话框(Dialog)轻松完成。我们将讨论如何创建这个功能,包括必要的API调用、权限管理以及图片显示和获取。 首先,我们需要了解...
创建一个继承自`DialogFragment`的类,可以更方便地管理和控制Dialog的生命周期。在`onCreateDialog()`方法中构建Dialog。 ```java public class CustomDialog extends DialogFragment { @NonNull @Override ...
例如,在anim目录下创建一个名为`dialog_up.xml`的文件,定义Dialog上升的动画过程: ```xml <set xmlns:android="http://schemas.android.com/apk/res/android"> android:fromYDelta="100%" android:toYDelta=...