关于dialog引起的java.lang.IllegalArgumentException:View=com.android.internal.policy.impl.PhoneWindow$Deco

转载 2016年05月30日 11:15:26
关于dialog引起的java.lang.IllegalArgumentException:View=com.android.internal.policy.impl.PhoneWindow$DecorViewnotattachedtowindowmanager错误的分析 在跑Monkey测试的时候出现了一个比较特别的问题,先来看看Log:


 1 // CRASH: com.meizu.media.painter (pid 12491)
 2 
 3 // Short Msg: java.lang.IllegalArgumentException
 4 
 5 // 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
 6 
 7 // Build Label: ***
 8 
 9 // Build Changelist: 1443062570
10 
11 // Build Time: 1443062722000
12 
13 // 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
14 
15 // at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:416)
16 
17 // at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:342)
18 
19 // at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)
20 
21 // at android.app.Dialog.dismissDialog(Dialog.java:354)
22 
23 // at android.app.Dialog.dismiss(Dialog.java:337)
24 
25 // at com.***.***.***.PainterDrawActivity.closeProgressDialog(PainterDrawActivity.java:60)
26 
27 // at com.***.***.painter.PainterDrawActivity.access$000(PainterDrawActivity.java:28)
28 
29 // at com.***.***.painter.PainterDrawActivity$1$2.run(PainterDrawActivity.java:49)
30 
31 // at android.os.Handler.handleCallback(Handler.java:815)
32 
33 // at android.os.Handler.dispatchMessage(Handler.java:104)
34 
35 // at android.os.Looper.loop(Looper.java:194)
36 
37 // at android.app.ActivityThread.main(ActivityThread.java:5741)
38 
39 // at java.lang.reflect.Method.invoke(Native Method)
40 
41 // at java.lang.reflect.Method.invoke(Method.java:372)
42 
43 // at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
44 
45 // at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
46 
47 //


从上面的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()方法之间。



转自:http://www.3fwork.com/b600/002582MYM030340/


java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{4380

转自:http://blog.csdn.net/yuxiaohui78/article/details/38076447 E/AndroidRuntime(9916): java.lang.Il...
  • u014368030
  • u014368030
  • 2015年03月17日 20:05
  • 4216

使用Activity.isfinishing()解决java.lang.IllegalArgumentException: View not attached to window manager

在页面中使用了dialog、popwindow等弹框控件的时候,有时候会报java.lang.IllegalArgumentException: View not attached to window...
  • u012264122
  • u012264122
  • 2016年07月23日 09:47
  • 2169

【Android】【Dialog】com.android.internal.policy.PhoneWindow$DecorView not attached to window manager

Dialog dismiss 问题 java.lang.IllegalArgumentException: View=com.android.internal.policy.PhoneWindow...
  • lotusve
  • lotusve
  • 2016年11月29日 10:29
  • 1141

解决当activity销毁之后dismiss()或者show()方法报错

错误:java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{8...
  • jing740321838
  • jing740321838
  • 2017年08月31日 17:05
  • 234

关于dialog引起的java.lang.IllegalArgumentException:View=com.android.internal.policy.impl.Ph

转自:http://blog.csdn.net/yuxiaohui78/article/details/38076447 E/AndroidRuntime(9916): Java.l...
  • LzLcheer
  • LzLcheer
  • 2017年02月28日 14:48
  • 570

【Android】java.lang.IllegalArgumentException Illegal character in scheme 异常

在使用字符串拼接成url地址进行数据请求的时候,有时在数据请求的时候会出现 java.lang.IllegalArgumentException: Illegal character in sche...
  • Sugar_Z_
  • Sugar_Z_
  • 2016年01月12日 21:56
  • 2068

Activity抛出异常has leaked window com.android.internal.policy.impl.PhoneWindow处理办法以及注意事项

安卓抛出异常: Activity com.qian.mobilesafe.CommunicationSafeActivity has leaked window com.android.inter...
  • qianhaifeng2012
  • qianhaifeng2012
  • 2016年03月11日 21:29
  • 1762

java.lang.IllegalArgumentException: no dialog with id 1 was ever shown via Activity#showDialog

这个是因为使用dismissDialog(id)的时候,系统并没有发现有Dialogid为指定数据的Dialog,所以最好把dismissDialog替换成removeDialog(dialogid)...
  • murphykwu
  • murphykwu
  • 2012年12月24日 19:04
  • 8087

HwLauncher﹕ Launcher dialog dismiss failed : java.lang.IllegalArgumentException: no dialog with id 1

现象:用手机做模拟器一直出现错误:HwLauncher﹕ Launcher dialog dismiss failed : java.lang.IllegalArgumentException: no...
  • yangyao_iphone
  • yangyao_iphone
  • 2015年10月16日 09:54
  • 3870

Robotium执行过程中常见crashed问题1:应用不完全关闭导致再次打开应用时crash

执行过程中INSTRUMENTATION_RESULT: shortMsg=Process crashed.导致执行中断, 以下是其中的一种情况,LOG如下 08-02 18:30:4...
  • xlyrh
  • xlyrh
  • 2016年08月02日 19:08
  • 1233
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于dialog引起的java.lang.IllegalArgumentException:View=com.android.internal.policy.impl.PhoneWindow$Deco
举报原因:
原因补充:

(最多只允许输入30个字)