Android排錯:has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added
異常場景:經常在應用中需要處理一些耗時的工作,諸如讀取大文件、訪問網絡資源等。為了避免因程序假死而帶來的糟糕用戶體驗,通常我們可以通過線程+Handler或者Android提供的AsyncTask來解決該問題,並一般以ProgressDialog等提示性控件來告知用戶當前的程序進度。而標題中描述的異常則會常常出現在這樣的場景中,並且往往掩蓋了導致異常的真正的罪魁禍首。
問題原因:
從異常描述中,大致的意思是存在窗口句柄泄露,即未能及時銷毀某個PhoneWindow。而這往往誤導了我們,把過多的精力放在查找所謂的內存泄露上了。其實存在這麼一種情況,即因我們在非主線程中的某些操作不當而產生了一個嚴重的異常,從而強製當前Activity被關閉。而在關閉的同時,卻沒能及時的調用dismiss來解除對ProgressDialog等的引用,從而係統拋出了標題中的錯誤,而掩蓋了真正導致這個錯誤的異常信息。
解決方法之一:
本解決方法並不能真正的解決問題,但是在一定程度上可以將真正導致錯誤的異常信息顯露出來。即重寫Activity的onDestroy方法,在方法中調用dismiss來解除對ProgressDialog等的引用。
最後更新:2017-04-02 06:51:51