今天在寫一個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完,于是就產生了所謂的窗體泄露。問題解決,這兩個方法也明白了又什么區別。