[Android] 안드로이드 - AAC View Model 과 Live data
AAC ViewModel
1. AAC ViewModel 이란?
안드로이드 MVVM 아키텍쳐에 대해 공부하다보니 AAC View Model 이라는 것에 대해 나온다.
MVVM 을 간단히 설명해보자면, Model - View - ViewModel 로 이루어진 구조를 말한다.
여기서,
Model 은 데이터를 가져오는 로직 자체
View 는 데이터를 보여주는 부분 (xml 과 Activity/Fragment)
ViewModel 은 View 에 보여지는 데이터를 관리하는 부분이다. Presenter 와 다르게 View 에 대한 참조를 하지 않는다.
MVVM 패턴에서 View 는 View Model 에 바인드되어, View Model 을 관찰한다(옵저버 패턴). 또한, View Model 의 변화가 있으면 View 에 즉각적으로 반영되도록 한다.
2. AAC ViewModel 을 사용하는 이유
사실, 안드로이드에서 AAC VeiwModel 을 사용하지 않고 MVVM 패턴의 ViewModel 을 구현할 수 있기는 하다.
하지만, 그렇게 되면 몇가지 문제점이 발생할 수 있다.
바로, 시스템에서 UI 컨트롤러를 제거하거나 다시 만드는 경우, 컨트롤러에 저장된 일시적인 모든 UI 관련 데이터가 손실된다는 것이다. 데이터가 단순할 경우에는 onSaveInstanceState() 메서드로 onCreate() 의 번들에서 데이터를 복원할 수 있지만, 목록이나 사진과 같은 대용량의 데이터의 경우에는 이러한 접근 방법이 적합하지 않다.
그러나, AAC View Model 을 사용하여 View Model 을 구현하면, 수명주기를 고려하여 UI 관련 데이터를 저장하고 관리된다. 그래서 화면을 회전하는 등 UI 컨트롤러가 재생성되는 경우에도 데이터가 유지된다.
또한, Acitvity 나 Fragment 와 같은 UI 컨트롤러는 주로 UI 데이터를 표시하거나, 사용자 작업에 반응하거나, 권한요청과 같은 운영체제 커뮤니케이션을 처리하도록 해야한다. 이외에 다른 무거운 작업들을 UI 컨트롤러에 할당하지 않고, View 데이터의 소유권을 View Model 로 분리하는것이 효율적이다.
3. AAC ViewModel 을 사용하는 방법
아래와 같이 ViewModel() 을 상속받는 ViewModel 클래스를 만든다음, Activit/Fragment 클래스에서 호출하여 사용한다.
users 라는 데이터는 Observable Field 를 사용하여 구현할 수도 있지만, LiveData 를 사용하는것이 더 권장된다. LiveData 에 대해 공부한 것들은 아래에 적어둠.
class MyViewModel : ViewModel() {
private val users: MutableLiveData<List<User>> by lazy {
MutableLiveData().also {
loadUsers()
}
}
fun getUsers(): LiveData<List<User>> {
return users
}
private fun loadUsers() {
// Do an asynchronous operation to fetch users.
}
}
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Create a ViewModel the first time the system calls an activity's onCreate() method.
// Re-created activities receive the same MyViewModel instance created by the first activity.
val model = ViewModelProviders.of(this)[MyViewModel::class.java]
model.getUsers().observe(this, Observer<List<User>>{ users ->
// update UI
})
}
}
LiveData
1. LiveData 란?
observable 한 data holder class 를 말한다. 기존의 observable 과 다르게, Live Data 는 액티비티, 프래그먼트 와 같은 앱 컴포넌트들의 라이프 사이클을 고려한다.
Live Data 를 관찰하는 Observer 클래스의 생명주기가 STARTED 또는 RESUMED 상태이면, Live Data 는 Observer 를 활성 상태로 간주한다. Live Data 는 활성 상태의 Observer 에게만 업데이트 정보를 알리고, 비활성화된 Observer 에게는 변경사항에 관한 알림을 보내지 않는다.
2. LiveData 를 사용하는 이유
Live Data 를 사용하면, 수명주기를 수동으로 처리하지 않아도 되고, 메모리 릭이 없어진다.
자세한 내용은 문서 참고 https://developer.android.com/topic/libraries/architecture/livedata#the_advantages_of_using_livedata
3. Live Data 를 사용하는 방법
아래의 코드와 같이 ViewModel 객체 내에서 데이터를 hold 하는 식으로 사용된다.
class NameViewModel : ViewModel() {
// Create a LiveData with a String
val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
// Rest of the ViewModel...
}
안드로이드 공식문서 참고 : https://developer.android.com/topic/libraries/architecture