按字面了解,Window Leaked大概就是說一個(gè)窗體泄漏了,也就是我們常說的內(nèi)存泄漏,為什么窗體會(huì)泄漏呢?
產(chǎn)生原因:
我們知道Android的每一個(gè)Activity都有個(gè)WindowManager窗體管理器,同樣,構(gòu)建在某個(gè)Activity之上的對(duì)話框、PopupWindow也有相應(yīng)的WindowManager窗體管理器。因?yàn)閷?duì)話框、PopupWindown不能脫離Activity而單獨(dú)存在著,所以當(dāng)某個(gè)Dialog或者某個(gè)PopupWindow正在顯示的時(shí)候我們?nèi)inish()了承載該Dialog(或PopupWindow)的Activity時(shí),就會(huì)拋Window Leaked異常了,因?yàn)檫@個(gè)Dialog(或PopupWindow)的WindowManager已經(jīng)沒有誰可以附屬了,所以它的窗體管理器已經(jīng)泄漏了。
解決方法:
關(guān)閉(finish)某個(gè)Activity前,要確保附屬在上面的Dialog或PopupWindow已經(jīng)關(guān)閉(dismiss)了。
比如:
@OverrideprotectedvoidonDestroy() {super.onDestroy();if(mDialog !=null) {
mDialog.dismiss();
}
}
吸取教訓(xùn):
如果我們?cè)谀砤ctivity中聲明了Dialog或者PopupWindow,確保在關(guān)閉當(dāng)前activity時(shí)候,這些狀體已經(jīng)關(guān)閉,否則會(huì)引起Window Leaked