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)