android.view.WindowLeaked

今天在写一个dialog的时候遇到了android.view.WindowLeaked这个异常。需求是弹出dialog点击退出的时候就把当前activity finish掉。然后就抛出这个异常。
具体原因就是,finish之前没有dismiss掉dialog。

原因

主要原因是因为android只允许在UI主线程操作,我在使用WindowManager添加一个View,WindowManager依附于Activity,这个view依存在Activity当中.在销毁Activity的时候, 通过WindowManager.addView()的方法添加的View就没有了依存,导致了窗体泄露。View不能独立存在,必须依附于Window。

解决方法

一开始我在onDestroy()里面调用了removeView方法,想要移除这个View来避免窗体泄露,发现这个方法并不管用,后来换成removeViewImmediate()解决了这个问题,原因就是两个方法设计到线程同步问题,removeViewImmediate()是通知View立刻调用View.onDetachedFromWindow(),这说明这个方法是通过一个监听或者观察者来实现的,因为线程的同步跟异步问题导致activity销毁了,但view还没有被remove完,于是就产生了所谓的窗体泄露。问题解决,这两个方法也明白了又什么区别。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容