Drawable 引起的内在泄漏

Memory Leak經驗分享-Drawable篇

之前在網路上找到一段程式碼,
可以輕鬆的在Logcat裡看到目前已使用的記憶體(heap memory)量︰

?
1
Log.i("tag", where+"usedMemory: "+Debug.getNativeHeapSize()/ 1048576L);
開發時遇到有好幾個ListView在同一個Activity裡做切換時,
heap memory一直累計,
最後導致OOM(OutOfMemory)

今天總算是解決了這個問題。
從Romain Guy先前的 presentation裡了解到︰
Android最直接影響heap memory的元件是︰
1)Bitmap
2)Drawable

所以,如果ListView裡有用到這3種元件的話,
請小心記憶體的使用,
並且要做好記憶體回收的管控。

底下這裡特別為Drawable做一點介紹︰

Romain Guy説Drawable是一個非常有趣的東西。
當我們呼叫它時,
他的背後其實有這層關係︰
當我們今天Activity被onDestroy時,
Drawable被回收了,但⋯

我們發現,
因為Context還在被Drawable的Callback參照(reference),
因此,Context無法被回收。
如果我們又再次開啟Activity,
此時記憶體就會變成︰
因此,造成了記憶體累加,
也就是所謂的Memory Leak。

解決方法就是將Drawable的Callback,
在Activity的onDestroy()中設為null。
?
1
Drawable.setCallback(null);
以上是Romain Guy對於Memory Leak的介紹影片中提到的問題,
也剛好解決了手上案子遇到的難題,
在這邊跟遇到此問題的同好分享。

你可能感兴趣的:(Drawable 引起的内在泄漏)