Handler使用不當衫仑,會導致內存泄露。
普通Handler初始化
這是簡單的一個Handler 初始化的代碼堕花,很簡潔明了(new 了一個非靜態(tài)內部類)。
? ? ? ?在Java中非靜態(tài)內部類和匿名內部類都會隱式持有當前類的外部引用 (劃重點)粥鞋,所以我們在Activity中使用非靜態(tài)內部類初始化了一個Handler,此Handler就會持有當前Activity的引用缘挽。
? ? ? ?在java,我們想要一個對象被回收呻粹,那么前提它不被任何其它對象持有引用壕曼,所以 當我們Activity頁面關閉之后,如果 此時Handler 并沒有釋放Activity的引用等浊,那么Activity不會被回收腮郊,當內存不足時,就會導致內存泄露筹燕。(場景:在Activity中使用Handler 做了一個延遲操作轧飞,Handler 因延遲時間未到 還沒有執(zhí)行衅鹿,Activity 被關閉)
? ? ? ? 解決辦法:
? ? ? ? 1.盡可能避免使用Handler做延遲操作。
? ? ? ? ?2.使用靜態(tài)內部類繼承Hanlder(靜態(tài)內部類不會持有外部對象的引用)过咬,如果我們需要在Handler中 使用外部的Activity時大渤,可以定義一個Activity弱引用(WeakReference)對象,弱引用在第二次GC回收時掸绞,可以被回收泵三。
靜態(tài)內部類Handler
?? ??? ??3.在onDestory 時,清除Handler消息隊列中的消息removeCallbacksAndMessages(null)