今天掘金上看了一篇文章,有一句話: 一定要多總結,對總結一下。
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...