Handler內(nèi)存泄漏原因及其解決方案

Handler使用不當(dāng),會導(dǎo)致內(nèi)存泄露。

普通Handler初始化

這是簡單的一個Handler 初始化的代碼,很簡潔明了(new 了一個非靜態(tài)內(nèi)部類)。

? ? ? ?在Java中非靜態(tài)內(nèi)部類和匿名內(nèi)部類都會隱式持有當(dāng)前類的外部引用 (劃重點),所以我們在Activity中使用非靜態(tài)內(nèi)部類初始化了一個Handler,此Handler就會持有當(dāng)前Activity的引用。

? ? ? ?在java,我們想要一個對象被回收,那么前提它不被任何其它對象持有引用,所以 當(dāng)我們Activity頁面關(guān)閉之后,如果 此時Handler 并沒有釋放Activity的引用,那么Activity不會被回收,當(dāng)內(nèi)存不足時,就會導(dǎo)致內(nèi)存泄露。(場景:在Activity中使用Handler 做了一個延遲操作,Handler 因延遲時間未到 還沒有執(zhí)行,Activity 被關(guān)閉)

? ? ? ? 解決辦法:

? ? ? ? 1.盡可能避免使用Handler做延遲操作。

? ? ? ? ?2.使用靜態(tài)內(nèi)部類繼承Hanlder(靜態(tài)內(nèi)部類不會持有外部對象的引用),如果我們需要在Handler中 使用外部的Activity時,可以定義一個Activity弱引用(WeakReference)對象,弱引用在第二次GC回收時,可以被回收。

靜態(tài)內(nèi)部類Handler

?? ??? ??3.在onDestory 時,清除Handler消息隊列中的消息removeCallbacksAndMessages(null)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容