android.view.WindowLeaked

今天在寫一個(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ū)別。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容