问题
我在使用WindowManager添加一个button, windowManager.addView(button,layoutParams);然后关闭当前的这个Activity的时候遇到了WindowLeak这个问题,也就是所谓的窗体泄露。
原因
主要原因是因为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完,于是就产生了所谓的窗体泄露。问题解决,这两个方法也明白了又什么区别。
文章来源:安卓 android.view.WindowLeaked解决方法_android.view.windowleaked:-CSDN博客