! ViewModel할때 사용하긴 했지만 정확하게 뭐때문에 써야하는지 몰랐기 때문에 다시 공부해서 정리해본다.
Live Data는 데이터를 가지고 있는 클래스(Data Holder Class)이고 수명 주기를(Life Cycle)을 인식한다.
즉 Activity, Fragment, Service 등의 앱 컴포넌트의 수명 주기를 고려하는데 이 수명 주기 인식을 통해 active 상태인 앱 컴포넌트 관찰자(Activity, Fragment, Service 등)만 업데이트한다.
여기서 관찰자 클래스(Observer class)로 나타내어지는 관찰자 수명 주기가 STARTED 또는 RESUMED 상태일 경우 LiveData는 관찰자를 active한 상태로 간주한다.
LifeCycleOwner 인터페이스를 구현하는 객체와 페어링된 관찰자를 등록할 수 있습니다.
-> 이것은 무슨말??
안드로이드 생명주기를 알고 있는 클래스이다. Activity 및 Fragment에서 이를 상속하고 있는데 이 말의 의미는 Activity와 Fragment라는 관찰자 클래스가 LifeCycleOwner라는 것이다.
그래서 만약 LifeCycle 객체(Activity 및 Fragment)의 상태가 DESTROYED로 변경될 경우 관찰자를 삭제할 수 있다.
LiveData는 Observer 패턴을 따른다. 즉 LiveData는 Observer의 수명 주기 상태에 맞추기 때문에 적합한 UI 데이터를 업데이트 해 줄 수 있다.
Observer가 LifeCycle 객체에 결합되어 있어서 앞서 말했듯이 상태가 DESTROYED 상태가 되면 자동으로 삭제 된다.
LiveData가 관찰하는 동안 Observer의 수명 주기 상태 변경을 인식하기 때문에 자동으로 관리한다.
수명 주기가 비활성화 상태였다가 다시 활성화 상태로 바뀔 경우 최신 데이터를 수신한다.
class NameViewModel : ViewModel(){
private val _currentName = MutableLiveData<String>()
val currentValue: LiveData<String>
get() = _currentValue
}
class NameActivity : AppCompatActivity(){
private val model : NameViewModel
override fun onCreate(savedInstanceState : Bundle?) {
super.onCreate(savedInstanceState)
val nameObserver = Observer<String> { newName ->
nameTextView.text = newName
}
model.currentName.observe(this, nameObserver)
button.setOnClickListener {
val anotherName = "John Doe"
model.currentName.setValue(anotehrName)
}
위와 같은 코드에서 setValue()를 호출할 경우 Observer는 anotherName의 값과 함께 onChanged() 메서드를 호출하고 UI가 업데이트된다.