每日一結 內部類引起的記憶體洩漏

2021-07-25 12:51:00 字數 1094 閱讀 5537

今天掘金上看了一篇文章,有一句話: 一定要多總結,對總結一下。

android常見的記憶體洩漏:

1. cursor沒有關閉,查詢資料庫後沒有關閉cursor;

2.呼叫registerreceiver後未呼叫unregisterreceiver().

3.未關閉inputstream/outputstream

4.bitmap使用後未呼叫recycle()

5.context洩露

6.靜態變數 內部類等

如下:

public class someactivity

} };

private void somemethod ()

} mhandler 持有someactivity的應用;當mhandler沒有被**,是不能被**的,當activity 呼叫finsh,mhandler的訊息佇列沒有處理完,那麼activity是不會被**的,這樣也就造成了所謂的記憶體洩漏。

有什麼解決方案?

方案#1:在關閉activity時(finish/onstop等函式中),取消還在排隊的message:mhandler.removecallbacksandmessages(null);

方案#2:使用weakreference截斷strongreference。問題的癥結既然是內部類持有外部類物件的引用,那我不用內部類就行了,直接使用靜態成員類。但mhandler又需要與activity物件互動,那就來個weakreference,指向外部activity物件。

public class someactivity

} @override

public void handlemessage(message msg)

someactivity v = ref.get();

if (v == null)

// handle message

} }

} 當activity想關閉銷毀時,mhandler對它的弱引用沒有影響,該銷毀銷毀;當mhandler通過weakreference拿不到activity物件時,說明activity已經銷毀了,就不用處理了,相當於丟棄了訊息。

尊重原創:

Android減少記憶體洩漏之靜態內部類的使用

我們在程式中往往為了省事而順手使用內部類實現所要功能,比如 new hanlder new thread new timertask 等等,但是這麼做恰恰會帶來隱患,既是 非靜態內部類會持有 所在類的物件,而如果此時是在activity中的話那麼所帶來的後果就是記憶體洩漏了。而要避免此類問題也很簡單...

非靜態內部類建立靜態例項造成的記憶體洩漏

在實際的專案開發中,有時候我們需要頻繁的啟動某個頁面 activity 啟動的時候總是需要初始化一些資源,為了避免重複建立相同資源,常常會使用靜態物件去儲存這些值,這種情況下,也很容易照成記憶體洩漏。請大家思考,為什麼會記憶體洩漏?我們結合leakcanary給出的提示去分析,mresource r...

安卓 Handler引起的記憶體洩漏

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