android.view.WindowLeaked

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容