今天在寫一個(gè)dialog的時(shí)候遇到了android.view.WindowLeaked這個(gè)異常远剩。需求是彈出dialog點(diǎn)擊退出的時(shí)候就把當(dāng)前activity finish掉列赎。然后就拋出這個(gè)異常宏悦。
具體原因就是,finish之前沒有dismiss掉dialog包吝。
原因
主要原因是因?yàn)閍ndroid只允許在UI主線程操作饼煞,我在使用WindowManager添加一個(gè)View,WindowManager依附于Activity诗越,這個(gè)view依存在Activity當(dāng)中.在銷毀Activity的時(shí)候, 通過WindowManager.addView()的方法添加的View就沒有了依存砖瞧,導(dǎo)致了窗體泄露。View不能獨(dú)立存在嚷狞,必須依附于Window块促。
解決方法
一開始我在onDestroy()里面調(diào)用了removeView方法,想要移除這個(gè)View來避免窗體泄露床未,發(fā)現(xiàn)這個(gè)方法并不管用竭翠,后來換成removeViewImmediate()解決了這個(gè)問題,原因就是兩個(gè)方法設(shè)計(jì)到線程同步問題薇搁,removeViewImmediate()是通知View立刻調(diào)用View.onDetachedFromWindow()斋扰,這說明這個(gè)方法是通過一個(gè)監(jiān)聽或者觀察者來實(shí)現(xiàn)的,因?yàn)榫€程的同步跟異步問題導(dǎo)致activity銷毀了啃洋,但view還沒有被remove完传货,于是就產(chǎn)生了所謂的窗體泄露。問題解決宏娄,這兩個(gè)方法也明白了又什么區(qū)別问裕。