프래그먼트에서 LiveData를 사용하기 전에 프래그먼트의 View가 종료되는 시점을 LifeCycle을 통해 알아보자!
Fragment Class 두 개를 준비하자!
binding.btn1.setOnClickListener {
val transaction = manager.beginTransaction()
val fragment = BlankFragment1()
transaction.replace(R.id.frameArea, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
binding.btn2.setOnClickListener {
val transaction = manager.beginTransaction()
val fragment = BlankFragment2()
transaction.replace(R.id.frameArea, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
버튼 두 개를 통해 프래그먼트1, 2로 옮겨다닐 수 있고, 뷰가 사라지는 시점을 알기 위해 다음과 같이 로그를 찍어주었다.
override fun onDestroyView() {
super.onDestroyView()
Log.d(TAG, "onDestoryView")
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG, "onDestroy")
}
버튼을 누를 때 마다 지금 화면에 나타나고 있는 뷰에서 onDestroyView가 실행되지만,
onDestroy는 실행되지 않음을 다음 로그를 통해 알 수 있다.
Fragment의 생명주기를 알았으니 이제 Fragment에서 LiveData를 사용하면서 더욱 구체적으로 알아보자!
class BlankViewModel : ViewModel() {
private var _mutableCount = MutableLiveData(0)
val liveCount : LiveData<Int>
get() = _mutableCount
fun plusCountValue(){
_mutableCount.value = _mutableCount.value!!.plus(1)
}
}
간단히 위의 코드로 ViewModel을 먼저 만들어주고,
binding.btn1.setOnClickListener {
viewModel.plusCountValue()
}
viewModel.liveCount.observe(viewLifecycleOwner, Observer {
binding.text1.text = it.toString()
})
Fragment1에서 버튼1을 눌렀을 때 숫자가 올라가고, 그 숫자가 올라간 것을 observer로 관찰하였다.
여기서 차이점이 있다!
액티비티에서는
ViewModel.liveCount.observe(this, ~~{ } )
이러한 형태로 사용하였다.
액티비티에서는 곧 자신이기 때문에 this로 전달하였지만 프래그먼트에서는 this를 전달하여 사용하면 안된다.
그 이유는 위의 사진을 참고하면 이해가 빠를 것이다.
프래그먼트는 액티비티와 다르게 onDestroy()가 호출되지 않은 상태에서 onCreateView가 여러 번 호출될 수 있기 때문이다.
다시말해, onDestroy()를 거치지 않은 상태에서 새로운 Observer가 등록되어, 중복으로 호출되는 현상이 발생할 수 있기 때문!!
따라서 viewLifeCycleOwner를 사용해서 중복 문제점을 해결할 수 있다!!
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] DataBinding + ViewModel + LiveData (0) | 2022.08.21 |
---|---|
[JETPACK개론] Map / SwitchMap (0) | 2022.08.20 |
[JETPACK개론] LiveData 와 MutableLiveData (0) | 2022.08.18 |
[JETPACK개론] LiveData (0) | 2022.08.17 |
[JETPACK개론] ViewModelFactory (0) | 2022.08.16 |