天天看点

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是一個非常有趣的東西。

當我們呼叫它時,

他的背後其實有這層關係︰

Drawable 引起的内在泄漏

當我們今天Activity被onDestroy時,

Drawable被回收了,但⋯

Drawable 引起的内在泄漏

我們發現,

因為Context還在被Drawable的Callback參照(reference),

因此,Context無法被回收。

如果我們又再次開啟Activity,

此時記憶體就會變成︰

Drawable 引起的内在泄漏

因此,造成了記憶體累加,

也就是所謂的Memory Leak。

解決方法就是將Drawable的Callback,

在Activity的onDestroy()中設為null。

?

1

Drawable.setCallback(null);

以上是Romain Guy對於Memory Leak的介紹影片中提到的問題,

也剛好解決了手上案子遇到的難題,

在這邊跟遇到此問題的同好分享。