在跑Monkey测试的时候出现了一个比较特别的问题,先来看看Log:

 // CRASH: com.meizu.media.painter (pid 12491)

 // Short Msg: java.lang.IllegalArgumentException

 // Long Msg: java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{21dd6762 V.ED.... R......D 0,0-538,105} not attached to window manager

 // Build Label: ***

 // Build Changelist: 1443062570

 // Build Time: 1443062722000

 // java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{21dd6762 V.ED.... R......D 0,0-538,105} not attached to window manager

 // at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:416)

 // at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:342)

 // at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)

 // at android.app.Dialog.dismissDialog(Dialog.java:354)

 // at android.app.Dialog.dismiss(Dialog.java:337)

 // at com.***.***.***.PainterDrawActivity.closeProgressDialog(PainterDrawActivity.java:60)

 // at com.***.***.painter.PainterDrawActivity.access$000(PainterDrawActivity.java:28)

 // at com.***.***.painter.PainterDrawActivity$1$2.run(PainterDrawActivity.java:49)

 // at android.os.Handler.handleCallback(Handler.java:815)

 // at android.os.Handler.dispatchMessage(Handler.java:104)

 // at android.os.Looper.loop(Looper.java:194)

 // at android.app.ActivityThread.main(ActivityThread.java:5741)

 // at java.lang.reflect.Method.invoke(Native Method)

 // at java.lang.reflect.Method.invoke(Method.java:372)

 // at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)

 // at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)

 //

从上面的Log可以看出是一个非法参数异常的问题。

那为什么会出现Long Msg: java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{21dd6762 V.ED.... R......D 0,0-538,105} not attached to window manager的问题呢?应用本身的崩溃怎么会联系到

PhoneWindow呢?

(1). 为什么报错com.android.phone已停止运行?

       通过查看网上资料可以知道,在原码中在其AndroidManifest.xml可以发现:android:sharedUserId="android.uid.phone"也就是和Phone在一个进程中,因此在报错的表现上来讲就会是PhoneWindow。

(2). 为什么会报View not attached to window manager错误?

       这个错误的意思是说我们所操作的View没有被纳入window manager的管理。
       我 们知道所有的窗口创建和管理都是依附于window manager的,因此Dialog的创建也不例外。Dialog的创建流程通过查看源码可以知道,在Dialog的构造函数中,创建了一个Window 对象,但我们知道Window对象并不是用于显示的,真正用于显示的是View对象。因此通过Dialog的show方法构造了一个mDecor的 View对象,并最终通过WindowManager的addView()方法显示Dialog。
       通过查看log信息我们可以看到PainterDrawActivity.closeProgressDialog(PainterDrawActivity.java:60)查看对应的closeProgressDialog代码后发现,在60行处代码为dialog.dismiss();
       在网络上搜索后发现,多数情况下出现这种错误,都是在dismiss Dialog时,发现创建该Dialog的Activity存在而导致的。
比如在界面上显示一个 Dialog,当任务处理结束后再Dismiss Dialog。如果在Dialog显示期间,该Activity因为某种原因被杀掉且又重新启动了,那么当任务结束时,Dismiss Dialog的时候WindowManager检查,就会发现该Dialog所属的Activity已经不存在了(重新启动了一次,是一个新的 Activity),所以会报IllegalArgumentException: View not attached to window manager.
通过以上分析我们可以知道在Dialog在执行dismiss方法时,发现启动它的Activity已经不见了,被杀掉了(现在这个是重新启动的),所以才报错出现异常。

(3). 为什么Activity会被"杀掉"?

由于是Monkey测试出现一次的Log,我们很难复现,只能从网上遇到类似问题的人看看他们的看法。

对于onSaveInstanceState方法,在Android SDK里面有这样的描述:Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as pressing the BACK key)
也就说当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。注意这里的容易二字,当前Activity并没有被销毁,只是系统觉得它有可能会被销毁因此会执行该方法。在该方法中我们可以保存Activity中的各种 数据信息,如果该Activity真的被杀掉而又重新启动后,可以使用onRestoreInstanceState方法在重新启动该Activity 时,还原我们之前保存的数据信息。onSaveInstanceState方法的调用遵循一个重要原则,即当系统“未经你许可”销毁了你的 Activity时,onSaveInstanceState就会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然如果你自 己不保存,那就没法恢复了)。
       因此通过以上分析我们可以看到Activity的确被杀掉后再次启动了。

(4). 在SActivity被杀掉时,Dialog存在么?

       可能大家会有疑问,Dialog都没有看到,就出现错误了,怎么能确定该Dialog当时一定是显示的呢?
       其实Activity在被销毁时,其所依附的Dialog是存在的。

(5). 如何解决这个问题呢?

       通过以上分析之后我们知道了问题出现的原因,那么如何解决呢?可以通过以下两个方面来解决:

1. 使用Activity自带的Dialog控制方法

       在 Activity中需要使用对话框,可以使用Activity自带的回调,比如 onCreateDialog(),showDialog(),dimissDialog(),removeDialog()等等。毕竟这些都是 Activity自带的方法,所以用起来更方便,也不用显示创建和操控Dialog对象,一切都由框架操控,相对来说比较安全。

2. 限制Dialog的生命周期

       让创建的Dialog对象的存活周期跟Activity的生命周期一致,也就是说Dialog的生命周期被限定在Activity的onCreate()和onDestroy()方法之间。
 
 

关于dialog引起的 java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView not attached to window manager 错误的分析的更多相关文章

  1. 关于java.lang.IllegalArgumentException: View not attached to window manager 错误的分析

    今天遇到一个很奇特的问题,当用户设置了PIN码,在锁屏界面正常解锁PIN码后,进入Launcher时显示com.android.phone 已停止运行.一开始猜想会不会是解锁PIN码的时候处理导致了P ...

  2. android在学习——activity关闭和dialog.dismiss冲突的解决(Activity has leaked window com.android.internal.policy.impl.PhoneWindow)

    当我们在退出整个程序的时候偶尔会出现这种报错:Activity has leaked window com.android.internal.policy.impl.PhoneWindow 其意思大概 ...

  3. decorview that was originally added here or java.lang.IllegalArgumentException: View not attached to window manager

    使用Dialog的时候,没少出现下面这两个报错 12-11 17:47:49.776: E/WindowManager(11461): android.view.WindowLeaked: Activ ...

  4. java.lang.IllegalArgumentException: View not attached to window manager

    公司项目线上bug: java.lang.IllegalArgumentException: View not attached to window manager at android.view.W ...

  5. 继承映射中的java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: person is not mapped [FROM person]

    继承映射中查询对象的过程中报错: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxExcep ...

  6. java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: student is not mapped

    Spring 5.0 +Jpa,使用@Query实现 自定义查询报错: java.lang.IllegalArgumentException: org.hibernate.hql.internal.a ...

  7. Android中 View not attached to window manager错误的解决办法

    前几日出现这样一个Bug是一个RuntimeException,详细信息是这样子的:java.lang.IllegalArgumentException: View not attached to w ...

  8. bug_ _java.lang.IllegalArgumentException: View not attached to window manager 2

    今天遇到一个很奇特的问题,当用户设置了PIN码,在锁屏界面正常解锁PIN码后,进入Launcher时显示com.android.phone 已停止运行.一开始猜想会不会是解锁PIN码的时候处理导致了P ...

  9. bug_ _java.lang.IllegalArgumentException: View not attached to window manager

    ============= 1   view not attached to window manager 转自:http://hi.baidu.com/spare_h/blog/item/7fa3e ...

随机推荐

  1. Android Paint和Color类

    要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下: se ...

  2. MVVM中轻松实现Command绑定(三)任意事件的Command

    WPF中不是所有的控件都有Command属性的,如果窗体我需要在ViewModel中处理Loaded事件命令,或者其他事件的命令时,很难都过绑定Command完成,必须要注册依赖属性或事件等,太麻烦了 ...

  3. POJ1680 Currency Exchange SPFA判正环

    转载来源:優YoU  http://user.qzone.qq.com/289065406/blog/1299337940 提示:关键在于反向利用Bellman-Ford算法 题目大意 有多种汇币,汇 ...

  4. SQL SERVER 2008查询其他数据库

    1.访问本地的其他数据库 --启用Ad Hoc Distributed Queries-- reconfigure reconfigure -- 使用完成后,关闭Ad Hoc Distributed ...

  5. IIS7 性能(内存、CPU、当前请求耗时)监测

    程序上线了,但运行过程中如果发现很CPU.内存异常,某些操作耗时,如何在生产环境中监测并查明原因呢,有以下几种工具(方式): 1.NProfiler,这是一个商业软件,有试用周期,可以监测包括Winf ...

  6. 常见shell操作

    一.find命令详细 find命令 -- 之查找指定时间内修改过的文件 比如我们要查找linux下指定时间内做过改动的文件,我们可以用find命令,其实find命令的功能十分强大,下面我们通过几个简单 ...

  7. 【转】终于知道为什么我的mysql总是卸载的不干净以及老是找不到my.ini文件

    感谢博主: http://blog.sina.com.cn/s/blog_6fc5bfa90100qmr9.html 如果你的电脑里装过MySQL,想再重新安装MySQL的时候可能就会因为前一版本卸载 ...

  8. 不只是打车软件,中国车主们赋予了Uber更多意义

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. 【三支火把】---C文件学习

    ---恢复内容开始--- 又看了一遍文件的知识点了,断断续续已经看了2-3遍,也就这次花了点时间做了一下总结,以后我想都不会再去翻书了,哈哈. 1. 基于缓冲区的文件操作2. 打开关闭文件3. 单个字 ...

  10. POJ3111 K Best

    Description Demy has n jewels. Each of her jewels has some value vi and weight wi. Since her husband ...