dialog显示报的错误
来源:互联网 发布:网络借贷安全班会 编辑:程序博客网 时间:2024/06/07 18:15
在activity中写了一个定时器来弹dialog,发现有时候会报错,一开始找不到原因,后来发现原来是定时器的原因。导致在activity 被 finish后还在跑导致的,
在网上找了大神们写的资料学习一下
java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{2f0d1a41 V.E..... R.....ID 0,0-74,74} not attached to window manager
(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()方法之间。 0 0
- dialog显示报的错误
- Dialog显示View报错的问题
- 显示倒计时的Dialog
- jqueryUI的dialog报错
- Primefaces 的dialog控件在ie下报js错误原因
- 全屏显示Dialog的设置
- 重写的Dialog显示问题
- 封装dialog显示的代码
- 全屏显示Dialog的设置
- easyui的dialog显示位置
- 设置Dialog的显示宽度
- 访问Struts2的方法页面报404错误,后端没有错误显示
- Dialog显示
- dialog显示
- Android自定义Dialog带Dialog的显示消失动画(一)
- 如何设置Dialog铺满全屏,更改Dialog的显示位置!!!
- jsp报的错误
- 设置Activity的显示形式为Dialog
- Ruby 中一些好用的方法(注意reduce方法)
- Linux系统调用列表
- Android TextView字体样式设置
- 关于Service和BroadcastReceiver
- Log4J日志配置详解
- dialog显示报的错误
- Mac下进行串口调试
- css3开发工具推荐
- 笔记 - JRebel for android
- 多个Activity之间共享数据的5种方式以及 Application Context
- Red packet~二分
- ipc
- Codeforces Round #202 (Div. 1) A. Mafia 【二分】
- 2016多校联合第三场 HDU5760