“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”
LiveData는 관찰 가능한 DataHolder Class로
일반적인 Observable
클래스와 달리 LifeCycle을 알고 있습니다.
따라서 LiveData는 Activte 상태일 때에만 데이터를 업데이트합니다.
LiveData 객체는 Oberver 객체와 함께 사용되는데
LiveData가 가지고 있는 데이터에 변화가 감지될 경우
등록된 Observer 객체에 이를 알려주고
Observer의 onChanged() 메소드가 실행된다.
ViewModel과 같이 사용되는 것을 권장하는 만큼 ViewModel을 사용해서 구현해보도록 한다.
ViewModel의 설명은 추후 포스팅 해보도록 하겠다.
class MyViewModel : ViewModel() {
val textValue : MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
위와 같이 ViewModel 안에 선언해준다.
LiveData는 사용(관찰)하고자 하는 데이터 타입을 제네릭을 통해서
인스턴스화 한다.
이제 Activity 단의 코드를 살펴보자
binding.apply {
btnLiveData.setOnClickListener {
CoroutineScope(Dispatchers.Default).launch {
for(idx in 0 .. 10) {
model.textValue.postValue(idx.toString())
delay(300)
}
}
}
model.textValue.observe(this@LiveDataActivity, Observer {
tvLiveData.text = it
})
}
버튼을 누르면 TextView에
0부터 10까지 차례대로 표시되도록 구현했다.
데이터의 변화가 일어나는 곳에서
postValue
를 통해서 데이터를 갱신하고
Observer
에서 데이터의 변화가 감지되면
해야할 일들을 정의하면 된다.
추가적으로 LiveData의 데이터 갱신은 기본적으로
model.textValue.value = 2
이런식으로
value
라는 필드를 사용한다.
하지만 위 코드처럼 다른 스레드에서 사용하게 되면 error가 발생하고
다른 스레드에서 갱신을 하려면 위 코드처럼 postValue
를 사용하면 된다.
찰떡 생각하니 배고프다
DataBinding과 같이 사용할 경우에
엄청난 시너지를 발휘하는데
Activity 단에서 뷰들을 직접 호출하지 않고
UI를 갱신할 수 있다.
DataBinding은 XML 내에서 표현식이 가능한 덕분인데
이는 나중에 포스팅을 해보도록 하겠다.
개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.