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() } }) }
文章標籤
全站熱搜