這個問題這又要跟WindowManager的兩個方法有關(guān)系望蜡,熟悉這兩個方法分分鐘解決這個問題迎变,那就是WindowManager的removeView和removeViewImmediate的方法
問題
我在使用WindowManager添加一個button涣达, windowManager.addView(button,layoutParams);然后關(guān)閉當(dāng)前的這個Activity的時候遇到了WindowLeak這個問題,也就是所謂的窗體泄露踊兜,
R}~O40HTD%%{G@G6NW91EZ6.png
原因
主要原因是因為android只允許在UI主線程操作犹赖,我在使用WindowManager添加一個View,WindowManager依附于Activity董瞻,這個view依存在Activity當(dāng)中寞蚌,在銷毀Activity的時候通過WindowManager.addView()的方法添加的View就沒有了依存田巴,導(dǎo)致了窗體泄露。View不能獨立存在挟秤,必須依附于Window壹哺。
解決方法
一開始我在onDestroy()里面調(diào)用了removeView方法,想要移除這個View來避免窗體泄露艘刚,發(fā)現(xiàn)這個方法并不管用管宵,后來換成removeViewImmediate()解決了這個問題,原因就是兩個方法設(shè)計到線程同步問題攀甚,removeViewImmediate()是通知View立刻調(diào)用View.onDetachedFromWindow()箩朴,這說明這個方法是通過一個監(jiān)聽或者觀察者來實現(xiàn)的,因為線程的同步跟異步問題導(dǎo)致activity銷毀了云稚,但view還沒有被remove完隧饼,于是就產(chǎn)生了所謂的窗體泄露。問題解決静陈,這兩個方法也明白了又什么區(qū)別燕雁。