前言
前段時間遇到了一個bug:android.view.WindowLeaked,這個看字面意思就很清楚了,窗體溢出。
産生原因
我們知道Activity中有個WindowManager(視窗管理器)。同樣,建構在某個Activity之上的對話框(Dialog)、PopupWindow也有相應的WindowManager窗體管理器。因為對話框、PopupWindown不能脫離Activity而單獨存在着,是以當某個Dialog或者某個PopupWindow正在顯示的時候Activity崩掉了,就會抛Window Leaked異常了,因為這個Dialog(或PopupWindow)的WindowManager找不到一個東西可以附屬,是以它的窗體管理器會經洩漏了。
解決方法
關閉(finish)某個Activity前,要確定附屬在上面的Dialog或PopupWindow已經關閉(dismiss)了。
注意
這類視窗出現的時候,如果Activity崩掉了,會彈那個洩漏的異常。是以解決完了窗體洩露還得測試下看Activity會不會崩潰(一般是會的),然後解決Activity崩掉的異常(看日志)。
舉個栗子
哎呀,拿錯了
上圖這段代碼就會産生視窗溢出,如果Activity崩潰的話
解決辦法:
@Override
protected void onStop()
{
try
{
mWindowManager.removeViewImmediate(overlay);
}catch (Exception e){
e.printStackTrace();
}
super.onStop();
}
總結
遇到這種窗體的,記得在頁面關閉的時候要關閉。