close

MVVM 的架構相信大家已經耳熟能詳了

在這個架構中

我們通常會配合 Android Jetpack 的 Architecture Components 來做使用

例如 ViewModel、LiveData…等

今天要說的是 Fragment 使用 LiveData 需要注意的情況

 

通常我們在 Fragmant 會想要像下面這樣去觀察 LiveData

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        // 監聽 View Action
        initListener()
        // 訂閱
        initObserver()
    }

    private fun initObserver() {
        lookingUpViewModel.showSnackbarMsg.observe(this,
            Observer { msg ->
                . . . 
            })
    }

 

但其實這樣使用會造成 memory leak 的問題

為什麼呢?

因為 Fragment 有個特別的生命週期

當他與 Activity 分離再連接時,他並不一定會被銷毀

不銷毀會發生什麼事呢?

 

當我們重新連接 Activity

原先的 LiveData 會持有一個新的 Observer

但 LiveData 不會刪除舊的 Observer

這樣就會造成越來越多的 Observer 在活動狀態

導致 Memory Leak 的發生

 

這時候就要用 Support Library 28 或 AndroidX 1.0.0 後提供的

getViewLifecycleOwner() or getViewLifecycleOwnerLiveData() 

他們取得的 lifecycle 和一般的不一樣

不是依照 Fragment 的週期

而是 Fragment View 的週期

進而解決此情況,最後會像這樣

private fun initObserver() {
    lookingUpViewModel.showSnackbarMsg.observe(viewLifecycleOwner,
        Observer { msg ->
            msg?.let {
                if (it.isNotEmpty())
                    Snackbar.make(
                        requireView(),
                        it,
                        Snackbar.LENGTH_SHORT
                    ).show()
            }
        })
}

 

 

 

 


arrow
arrow

    顏澤偉 發表在 痞客邦 留言(0) 人氣()