記憶體優化實戰
阿新 • • 發佈:2020-09-10
最近,因為專案時間不緊的原因,就對專案的某些頁面進行了記憶體觀察,發現了兩處優化點.特意記錄下來
1.單例引發的記憶體洩漏
我在專案中涉及到的一個單例是這樣的
object LiveCenter { ...... var function: Function1<Boolean, Any>? = null fun registerListener(function: Function1<Boolean, Any>?) { this.function = function } ...... }
LiveCenter 註冊了一個監聽.這個 Function1 是在 Fragment 中 new 了一個例項.這個時候 LiveCenter 就持有了 Fragment 的引用導致記憶體洩漏.所以需要寫一個 release 方法,在 release 方法中使 function = null 這個和常說的 Context 引發記憶體洩漏其實差不多.這個可以通過 Android Studio 自帶的 Android Profiler.具體用法自己搜吧
2.Fragment 作為 Listener 引發的記憶體洩漏
有的時候為了方便我們會這麼寫
public class Instance { public Instance(Listener listener) { this.listener = listener; } } public class FragmentA extends BaseFragment implements Listener { }
這麼寫很常見,如果只是 FragmentA 每 new 一次, Instance 也 new 一次.那麼就沒啥問題.但如果 FragmentA 對應的 Activity 是 SingleTask 模式.也就是說 FragmentA 可能會多次整個重新整理,導致了每次都 new Instance.每次 new 就多了一個引用導致記憶體洩漏.所以在這種情況下一定要注意把那個 listener 置為 null