Android JetPack 라이브러리 중 하나인 LiveData에 대해 알아보겠습니다.
특히, LiveData는 ViewModel과 DataBinding과 함께 유용하게 사용됩니다.
LiveData
LiveData는 관찰(observe) 가능한 데이터 홀더 클래스입니다. 스스로 수명 주기(LifeCycle)를 인식합니다.
LiveData의 장점
- UI와 데이터 상태의 일치 보장
- 메모리 누수 없음
- 비정상 종료 없음
- 수명 주기를 자동으로 처리
- 최신 데이터 유지
- 기기 회전, Activity / Fragment 재생성시에도 최신 데이터 즉시 반영
- 리소스 공유
Android Developers 공식 문서를 참고했습니다.
LiveData 실행 예시
먼저 app수준 build.gradle에 종속성을 추가합니다. ViewModel을 사용하지 않을 경우 맨 마지막 줄의 종속성만 추가하셔도 무방합니다.
// by viewModels()를 이용하기 위한 종속성
implementation 'androidx.activity:activity-ktx:1.4.0'
implementation 'androidx.fragment:fragment-ktx:1.4.1'
// ViewModel
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
// Livedata
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
저는 LiveData 객체를 ViewModel에서 생성하기 위해 ViewModel 클래스를 만들어 주도록 하겠습니다.
MainViewModel
class MainViewModel(count : Int, ) : ViewModel() {
val liveData : MutableLiveData<Int> = MutableLiveData(count)
}
LiveData는 추상 클래스이기 때문에 LiveData 클래스를 상속받는 MutableLiveData 클래스로 생성해 줍니다.
MainActivity
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// viewModel의 liveData 값 관찰
viewModel.liveData.observe(this) {
binding.numberOutput.text = it.toString()
}
// 증가 버튼 클릭
binding.plusButton.setOnClickListener {
viewModel.liveData.value = viewModel.liveData.value?.plus(1)
}
// 감소 버튼 클릭
binding.minusButton.setOnClickListener {
viewModel.liveData.value = viewModel.liveData.value?.minus(1)
}
}
}
observe에서 첫 번째 매개변수인 this는 LifeCycleOwner인 MainActivity입니다.
관찰하고 있는 동안 LiveData의 value 값의 변화가 감지되면 두 번째 매개변수인 중괄호 내부가 실행됩니다.
위 코드에서는 증가 / 감소 버튼을 클릭 시 viewModel.liveData의 value 값에 1을 더하거나 빼도록 코드를 작성했습니다.
viewModel.liveData.value의 값의 변경이 감지되면 자동으로 UI(numberOutput)가 갱신되는 것을 볼 수 있습니다.
간단한 예제를 통해 LiveData에 대해 공부해 보았습니다.
다음 포스팅에서는 공부한 내용을 바탕으로 DataBinding에 대해 알아보겠습니다 :)
'Jetpack Library' 카테고리의 다른 글
[Android JetPack] 안드로이드 JetPack 알아보기 (2) | 2023.01.25 |
---|---|
[Android JetPack] Room을 이용해 로컬 데이터베이스 사용하기 - 회원가입 예제 (6) | 2023.01.11 |
[Android JetPack] DataBinding + LiveData + ViewModel + Repository 적용해보기 (0) | 2023.01.05 |
[Android JetPack] DataBinding 알아보기 (0) | 2023.01.05 |
[Android JetPack] ViewModel 이란? ( + ViewModelFactory) (0) | 2023.01.03 |