最近开始对APP上的Crash进行对应,发现有好多常见的问题,同一个问题在多个APP都类似的出现了,这里记录下这些常见的错误。

crash log:

java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{29b8ae38 V.E..... R.....I. 0,0-1160,607} not attached to window manager
at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:370)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:299)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:84)
at android.app.Dialog.dismissDialog(Dialog.java:329)
at android.app.Dialog.dismiss(Dialog.java:312)

设备信息:系统版本:4.4.2

根据错误log可以看出基本又是在Activity的生命周期上出现的问题,Activity已经销毁了,再调用Dialog.dismiss()方法。

经过代码排查,定位到了问题:

handler.postDelayed(dismissDialogRunnable,1000);

在Activity已经finish了,延迟1s后执行dismissDialogRunnable内对Dialog进行销毁。

知道问题了,就很好解决了,取消延迟,在Activity的OnDestory方法中销毁Dialog。

追根究底,下载了对应系统的的源码查看:

首先:Dialog.dismiss()方法:

在dismissDialog方法中调用了WindowManager的removeViewImmediate方法:

  @Override
public void removeViewImmediate(View view) {
mGlobal.removeView(view, true);
}

mGlobal是WindowManagerGlobal实例对象,继续深入:

 public void removeView(View view, boolean immediate) {
if (view == null) {
throw new IllegalArgumentException("view must not be null");
} synchronized (mLock) {
int index = findViewLocked(view, true);
View curView = mRoots.get(index).getView();
removeViewLocked(index, immediate);
if (curView == view) {
return;
} throw new IllegalStateException("Calling with view " + view
+ " but the ViewAncestor is attached to " + curView);
}
}
    private int findViewLocked(View view, boolean required) {
final int index = mViews.indexOf(view);
if (required && index < 0) {
throw new IllegalArgumentException("View=" + view + " not attached to window manager");
}
return index;
}

在WindowManagerGlobal.findViewLocked中,会获取Dialog所在Window.decorView的位置,如果获取不到,则抛出异常。

至此,该问题发生的原因已经非常明了了。

其中部分内容参照:http://www.cnblogs.com/reverie/p/4846958.html

最新文章

  1. BZOJ1097: [POI2007]旅游景点atr
  2. 12个免费的 Twitter Bootstrap 后台模板
  3. RHEL本地yum源
  4. 摘:JavaScript性能优化小知识总结
  5. form表单中的常用控件
  6. Sublime Text 3关闭自动更新
  7. Begin using git (Part1) - Git的安装与配置
  8. ASPX在Debug模式下直接link原始CSS而非Bundle后的CSS
  9. 部署hibernate框架项目时出现问题:The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files.
  10. StringIO模块字符串的缓存
  11. [置顶] Embedded Server:像写main函数一样写Web Server
  12. 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length
  13. SpringMVC转发和重定向区别!
  14. 《Spark Python API 官方文档中文版》 之 pyspark.sql (二)
  15. luogu P4385 [COCI2009]Dvapravca
  16. 《Linux内核设计与实现》读书笔记——第四章
  17. jquery的$post方法不发送空数组的解决办法
  18. Springboot listener
  19. VS工具相关内容
  20. 20155234 《Java程序设计》实验四 (Android程序设计)实验报告

热门文章

  1. MVC-路由解析
  2. 数字签名---RSA算法
  3. Python爬取全球疫情数据,实现可视化显示地图数据(附代码)
  4. Linux - centos7.X安装tomcat8
  5. mac使用brew安装mysql5.7
  6. 2019-2020-1 20199325《Linux内核原理与分析》第八周作业
  7. 二, 连接Oracle 二
  8. 【Linux常见命令】rm命令
  9. LNMP环境搭建之php安装
  10. Jaba_Web--JDBC 修改记录操作模板