Live Data는 Data를 저장하고 변화를 관찰할 수 있는 객체이다. Observer를 구독하면 Data가 변경될 때마다 UI를 업데이트할 수 있다. 일반 Observable Class와 달리 Live Data는 수명주기를 인식한다. 수명주기 인식을 통해 Activity 수명주기 상태에 있는 앱 컴포넌트 Observer만 업데이트 한다. 관찰자의 수명주기가 STARTED 또는 RESUMED 상태에서만 옵저버에게 데이터 변경을 알린다.
LifecycleOwner 인테페이스를 구현하는 객체와 페어링된 관찰자를 등록할 수 있다. 이 관계를 사용하면 관찰자에 대응되는 LifeCycle 객체의 상태가 DESTROYED로 변경될 때 관찰자를 삭제할 수 있다. 특히 Activity와 Fragment가 LiveData 객체를 안전하게 관찰할 수 있고 Activity와 Fragment의 수명 주기가 끝나는 즉시 수신 거부되어 누수를 걱정하지 않아도 되므로 유용하다.
1. build.gradle
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
2. ViewModel 생성(LiveData 객체)
class MyNumberViewModel : ViewModel() {
// 뮤터블 라이브 데이터 - 수정 가능
private val _currentValue = MutableLiveData<Int>()
// 라이브 데이터 - 수정 불가능, observer에 노출
// 라이브 데이터 캡슐화
val currentValue: LiveData<Int>
get() = _currentValue
// 초기화
init {
Log.d("MyNumberViewModel", "생성자 호출")
_currentValue.value = 0
}
}
3. LiveData 객체 관찰
onCreate() 메서드에서 호출한다.
ViewModelProvider를 사용하여 View model을 가져온다.
(by viewModels()를 사용하는 방법 도 있는데 그건 gradle 추가 해줘야 한다.)
class ViewModelActivity : AppCompatActivity(){
// 나중에 값이 설정될거라고 lateinit 으로 설정
lateinit var myNumberViewModel: MyNumberViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_viewmodel)
// view model instance가져옴
myNumberViewModel = ViewModelProvider(this).get(MyNumberViewModel::class.java)
// view model이 가지고 있는 live data에 접근 값이 변경되면 바로 알 수 있다
myNumberViewModel.currentValue.observe(this, Observer {
tv_result.setText(it.toString())
})
}
}
4. Live data 객체에 업데이트 함수 생성하고 main에서 호출할 수 있다
- [참고](https://developer.android.com/topic/libraries/architecture/livedata?hl=ko)
'Application Programming > Android' 카테고리의 다른 글
[Android/Java] Fragment간 값 전달 (0) | 2021.06.28 |
---|---|
[Android/Java] BlankFragment (0) | 2021.06.28 |
[Android/Java] naver map api (0) | 2021.06.19 |
[Android/Firebase] Firebase 연동 (0) | 2021.06.16 |
[Android/Java] 지나가는 비행기 (0) | 2021.06.14 |