天天看點

android.view.WindowLeaked窗體溢出解決辦法前言産生原因解決方法注意舉個栗子總結

前言

前段時間遇到了一個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崩掉的異常(看日志)。

舉個栗子

android.view.WindowLeaked窗體溢出解決辦法前言産生原因解決方法注意舉個栗子總結

哎呀,拿錯了

android.view.WindowLeaked窗體溢出解決辦法前言産生原因解決方法注意舉個栗子總結
android.view.WindowLeaked窗體溢出解決辦法前言産生原因解決方法注意舉個栗子總結
android.view.WindowLeaked窗體溢出解決辦法前言産生原因解決方法注意舉個栗子總結
android.view.WindowLeaked窗體溢出解決辦法前言産生原因解決方法注意舉個栗子總結
android.view.WindowLeaked窗體溢出解決辦法前言産生原因解決方法注意舉個栗子總結

上圖這段代碼就會産生視窗溢出,如果Activity崩潰的話

解決辦法:

@Override
protected void onStop()
{
    try
    {
        mWindowManager.removeViewImmediate(overlay);
    }catch (Exception e){
        e.printStackTrace();
    }

    super.onStop();
}

           

總結

遇到這種窗體的,記得在頁面關閉的時候要關閉。

繼續閱讀