洩露記憶體之 handler的優化

2021-07-07 10:05:36 字數 738 閱讀 4899

兩個案例

handler mhandler = new handler()

}postdelayed()

handler引起記憶體洩露的原因

使用handler導致記憶體洩露的解決方法

方法一:通過程式邏輯來進行保護:

方法二:將handler宣告為靜態類:

static class myhandler extends handler

}但其實沒這麼簡單。使用了以上**之後,你會發現,由於handler不再持有外部類物件的引用,導致程式不允許你在handler中操作activity中的物件了。所以你需要在handler中增加乙個對activity的弱引用(weakreference):

static class myhandler extends handler

@override

public void handlemessage(message msg) }}

什麼是弱引用?

weakreference弱引用,與強引用(即我們常說的引用)相對,它的特點是,gc在**時會忽略掉弱引用,即就算有弱引用指向某物件,但只要該物件沒有被強引用指向(實際上多數時候還要求沒有軟引用,但此處軟引用的概念可以忽略),該物件就會在被gc檢查到時**掉。對於上面的**,使用者在關閉activity之後,就算後台執行緒還沒結束,但由於僅有一條來自handler的弱引用指向activity,所以gc仍然會在檢查的時候把activity**掉。這樣,記憶體洩露的問題就不會出現了。

記錄 關於匿名Handler記憶體洩露問題

rt 在inspect code中發現了某個記憶體洩露的提示 提示在這個activity類中可能存在記憶體洩露,如下 常規的handler寫法,此處看的有點蒙,為什麼會有記憶體洩露,於是度娘查了一下。在查明原因後,有兩種解決方案,如下 1 通過程式邏輯來進行保護,即removecallbacks 方...

記憶體洩露和優化

記憶體洩露和優化 概述 通過unityengine命名空間中的介面分配的記憶體,將會通過unity分配在native堆 通過system命名空間中的介面分配的記憶體,將會通過mono runtime分配在mono堆 resources.unloadunusedassets 內部包括gc gc.col...

Handler記憶體洩露原因及解決方法

原因 非靜態內部類 包括匿名內部類 預設就會持有外部類的引用,當非靜態內部類物件的生命週期比外部類物件的生命週期長時,就會導致記憶體洩漏。三種解決方案 1.把handler類放在單獨的類檔案中 2.靜態內部類 弱引用 3.activity不可見時,清空訊息佇列 new handler postdel...