Handler引起的記憶體洩漏及解決方法

2021-08-15 19:31:45 字數 1175 閱讀 4809

在進行非同步操作時,我們經常會使用到handler類。常見的寫法如下。

public

class mainactivity extends activity   

};  

}  當使用內部類或匿名內部類的方式建立handler時,handler物件會隱式地持有乙個外部類物件的引用(這裡的外部類是activity)。一般在乙個耗時任務中會開啟乙個子執行緒,如網路請求或檔案讀寫操作,我們會使用到handler物件。但是,如果在任務未執行完時,activity被關閉了,activity已不再使用,此時由gc來**掉activity物件。由於子執行緒未執行完畢,子執行緒持有handler的引用,而handler又持有activity的引用,這樣直接導致activity物件無法被gc**,即出現記憶體洩漏。

所以這段**有可能會引起記憶體洩漏。

下面用一段**示例來說明。

public

class mainactivity extends activity   

}).start();  

}  private handler mhandler = new handler()   

}  };  

}  解決方法主要在於兩點:

1.將handler宣告為靜態內部類。因為靜態內部類不會持有外部類的引用,所以不會導致外部類例項出現記憶體洩露。

2.在handler中新增對外部activity的弱引用。由於handler被宣告為靜態內部類,不再持有外部類物件的引用,導致無法在handlemessage()中操作activity中的物件,所以需要在handler中增加乙個對activity的弱引用。

改善之後的**如下。

public

class mainactivity extends activity   

@override

public

void handlemessage(message msg)   

// your code here

}  }  

關於weakreference的說明:

weakreference即弱引用,與強引用(即我們常說的「引用」)相對。它的特點是,gc在**時會忽略掉弱引用,即就算有弱引用指向某物件,但只要該物件沒有被強引用指向,該物件就會在被gc檢查到時**掉。

安卓 Handler引起的記憶體洩漏

myhandler activity activity override public void handlemessage message msg 將 改為以上形式之後,就算完成了。還有一種就是當activity銷毀的時候,也就是在ondestroy 方法裡加上 mhandler.removeca...

防止handler記憶體洩漏

記憶體洩漏 程式執行會用到記憶體,在退出程式的時候,占用記憶體的資料沒有釋放,那麼當資料越來越多的時候,就會產生記憶體洩漏。handler為什麼會記憶體洩漏呢,handler是個內部類,內部類會持有外部類的引用,內部類需要依賴外部類。handler需要定義為靜態類,當你推出activity,hand...

Handler系列之記憶體洩漏

本篇簡單的講一下平常使用handler時造成記憶體洩漏的問題。什麼是記憶體洩漏?大白話講就是分配出去的記憶體,不回來。嚴重會導致記憶體不足oom。下面來看一下造成記憶體洩漏的 public class memoryleakactivity extends activity private class...