1. 程式人生 > 實用技巧 >記憶體優化實戰

記憶體優化實戰

最近,因為專案時間不緊的原因,就對專案的某些頁面進行了記憶體觀察,發現了兩處優化點.特意記錄下來

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