쏭식
Ssongcode;
쏭식
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • JAVA (21)
      • Basic (21)
    • Kotlin (14)
      • Basic (14)
    • Android (64)
      • Basic (24)
      • JETPACK (30)
      • Compose (8)
      • 파고들기 (2)
    • Project (4)
    • etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Jetpack
  • 변수
  • livedata
  • 리사이클러뷰
  • 배열
  • 메소드
  • 기초100제
  • 백준
  • 알고리즘
  • AAC
  • Adapter
  • 상속
  • 코딩테스트
  • 자바
  • 컴포즈
  • 객체지향
  • Room
  • 자료구조
  • 코틀린코테
  • 프로젝트회고
  • 코테
  • DataBinding
  • mvvm
  • Kotlin
  • ViewModel
  • Android
  • compose
  • 코드업100제
  • 코틀린
  • workmanager

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쏭식

Ssongcode;

[JETPACK개론] Fragment LiveData / LifeCycleOwner
Android/JETPACK

[JETPACK개론] Fragment LiveData / LifeCycleOwner

2022. 8. 19. 23:59

프래그먼트에서 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를 사용해서 중복 문제점을 해결할 수 있다!!

 

 

GitHub - SsongSik/JetPack_Android_Practice: Android practice using the Jetpack library

Android practice using the Jetpack library. Contribute to SsongSik/JetPack_Android_Practice development by creating an account on GitHub.

github.com

 

저작자표시 (새창열림)

'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
    'Android/JETPACK' 카테고리의 다른 글
    • [JETPACK개론] DataBinding + ViewModel + LiveData
    • [JETPACK개론] Map / SwitchMap
    • [JETPACK개론] LiveData 와 MutableLiveData
    • [JETPACK개론] LiveData
    쏭식
    쏭식

    티스토리툴바