你並不一定要用弱引用來避免記憶體洩漏

發表於2016-12-19

原文:You don’t have to use WeakReference to avoid memory leaks

1481559287314992

我的一個同事最近提到他們看的一個演講,其中講到:

如果你是一個安卓開發者卻不使用弱引用,那麼你就有麻煩了。

我個人認為這不僅是一種錯誤觀點,而且相當誤導人。WeakReference(弱引用)應該是修復記憶體洩漏的最後手段。

然後今天,我看到了Enrique López Mañas釋出在Google Developers Experts專欄的一篇文章。

Finally understanding how references work in Android and Java
A few weeks ago I attended Mobiconf, one of the best conferences for Mobile Developers I had the pleasure to attend in…medium.com

這是一篇總結Java引用的好文章。

這篇文章並沒有說必須使用弱引用,但是也沒有給出替代的方案。我覺得我必須給出其它的方法來闡明弱引用並不是必須使用。

如果你不使用弱引用並不會真的有什麼問題

我認為處處使用弱引用並不是一種最佳實踐。使用弱引用來修復記憶體洩漏的問題往往意味著缺乏合理的架構。

雖然文章中給出的例子修復了潛在的記憶體洩漏問題,但是也有其它的方法。我可以給出兩個耗時後臺任務中避免記憶體洩漏的例子。

避免AsyncTask記憶體洩漏的簡單例子:

Activity:

這裡是AsyncTask:

當然這個例子非常基礎,但是我認為作為另一種解決方案的演示來說足夠了。

這裡是另一個使用RxJava實現的簡單例子,我們仍然沒有使用弱引用。

注意如果我們沒有unsubscribe Subscription那麼仍然可能會出現記憶體洩漏。

最後我給出兩個Novoda的專案,它們是很好的學習資源。你可能猜到了,它們並沒有使用任何弱引用:)。

novoda/bonfire-firebase-sample
bonfire-firebase-sample – An app to discuss your favourite emojis. This is a sample app built with Firebase.github.com

novoda/spikes
spikes – Where ideas & concepts are born & incubatedgithub.com

我認為一個很重要的守則是讓內部類為靜態的。尤其是它們要做耗時的後臺任務的時候。或者更好的方法是把這個類移到外面作為單獨的類。

用非靜態的內部類做耗時的後臺任務總是很糟糕的實踐,不光是在安卓中。

相關文章