샘플은 구글
패턴의 변화
- ViewModel클래스는 UI 관련 데이터를 라이프 사이클을 고려한 방식으로 저장하고 관리하도록 설계되었습니다. 이 ViewModel클래스를 사용하면 화면 회전과 같은 구성 변경시에도 데이터를 유지할 수 있습니다.
뷰모델
- 뷰모델은 옵저버패턴이라고 이해중
- 데이터가 변화 가능한곳에 콜백 같은 옵저버를 추가한다.
- UI 쪽에서 해당 데이터의 콜백을 이용하여 업데이트 한다.
- 데이터를 콜백 형태로 묶어 놓기 때문에 위에서 말하는 UI 와 완전 분리가 가능하다.
- 예를 들어 특정 데이터가 변경 되면 콜백 발생하도록 하고 콜백에서 UI 업데이트를 처리한다.
- 이런 개념으로 이해 함
- BasicRxJavaSampleKotlin 기본으로 공부 중
- 콜백을 넣어 주는 부분이 직접접이지 않아 이해 하고 있어야 이해가 된다.
- 아래와 같은 코드가 있을 때 Rx 를 이용해서 viewModel.userName() 변화를 감지하여 UI 업데이트
- 클릭 이벤트에서 updateUserName() 를 호출 하면 DB 완료후 결과를 다시 읽어 UI 를 업데이트 함
- 하지만 뷰모엘을 이용하면 콜백으로 변경 내용을 확인 하므로 UI 업데이트에 대한 의존성을 없앨수 있다.
```kotlin override fun onStart() { super.onStart() // Subscribe to the emissions of the user name from the view model. // Update the user name text view, at every onNext emission. // In case of error, log the exception. disposable.add(viewModel.userName() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ this.user_name.text = it }, { error -> Log.e(TAG, “Unable to get username”, error) })) }
override fun onStop() {
super.onStop()
// clear all the subscription
disposable.clear()
}
private fun updateUserName() {
val userName = user_name_input.text.toString()
// Disable the update button until the user name update has been done
update_user_button.isEnabled = false
// Subscribe to updating the user name.
// Enable back the button once the user name has been updated
disposable.add(viewModel.updateUserName(userName)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ update_user_button.isEnabled = true },
{ error -> Log.e(TAG, "Unable to update username", error) }))
}
```