ViewModel 정리

강보훈·2021년 12월 10일
0

MVVM 사용해보자

목록 보기
2/3

개요

  • 수명 주기를 고려해서 UI 관련 데이터를 저장하고 관리하도록 설계된 클래스이다. 이를 사용하면 화면 회전과 같이 구성을 변경할 때도 데이터 유지가 가능하다.
  • 시스템에서 UI 컨트롤러를 제거하거나 다시 만드는 경우, 컨트롤러에 저장된 모든 일시적인 UI 관련 데이터가 제거된다. 간단한 데이터라면 onSaveInstanceState()를 사용해서 복원할 수 있지만 정말 소량의 데이터의 경우에만 적합하다.
  • 단일 클래스에서 앱의 작업을 모두 처리하면 테스트가 어려워질 뿐더러 유지보수도 힘들다. 따라서 UI 컨트롤러 로직에서 뷰 데이터 소유권을 분리하는 방법이 훨씬 쉽고 효율적이다.

구현

  • ViewModel 객체는 구성이 변경되는 동안 자동으로 보관되므로, 이러한 객체가 보유한 데이터는 다음 view에서 즉시 사용할 수 있다. 예를 들면 다음 샘플 코드처럼 사용자 목록을 확보하여 view 대신 ViewModel에 보관하도록 책임을 할당해야 한다.

    class MyViewModel : ViewModel() {
        private val users: MutableLiveData<List<User>> by lazy {
            MutableLiveData<List<User>>().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.
    
            // Use the 'by viewModels()' Kotlin property delegate
            // from the activity-ktx artifact
            val model: MyViewModel by viewModels()
            model.getUsers().observe(this, Observer<List<User>>{ users ->
                // update UI
            })
        }
    }
    • 이 부분은 아직 잘 이해가 가지 않는다.

      ViewModel 객체는 뷰 또는 LifecycleOwners의 특정 인스턴스화보다 오래 지속되도록 설계되었습니다. 이러한 설계로 인해 뷰 및 Lifecycle 객체에 관해 알지 못할 때도 ViewModel을 다루는 테스트를 더 쉽게 작성할 수 있습니다. ViewModel 객체에는 LiveData 객체와 같은 LifecycleObservers가 포함될 수 있습니다. 그러나 ViewModel 객체는 LiveData 객체와 같이 수명 주기를 인식하는 Observable의 변경사항을 관찰해서는 안 됩니다. 예를 들어 ViewModel은 시스템 서비스를 찾는 데 Application 컨텍스트가 필요하면 AndroidViewModel 클래스를 확장하고 생성자에 Application을 받는 생성자를 포함할 수 있습니다(Application 클래스가 Context를 확장하므로).


수명주기

  • ViewModel 객체의 범위는 ViewModel을 가져올 때 ViewModelProvider에 전달되는 Lifecycle로 지정된다. ViewModel은 범위가 지정된 Lifecycle이 영구적으로 경과될 때까지, 즉 활동에서는 활동이 끝날 때까지 그리고 프래그먼트에서는 프래그먼트가 분리될 때까지 메모리에 남아 있다.
  • 아래 그림에서는 활동이 회전을 거친 다음 끝날 때까지 활동의 다양한 수명 주기 상태를 보여준다. 또한 관련 활동 수명 주기 옆에 ViewModel의 전체 기간과 이 특정 다이어그램에서는 활동의 상태를 보여준다. 동일한 기본 상태가 프래그먼트의 수명 주기에 적용된다.
  • 일반적으로 onCreate()를 처음 호출할 때 ViewModel을 요청한다. ViewModel이 처음 요청 된 순간부터 활동이 끝나고 폐기될 때까지 ViewModel은 존재한다.

ViewModel로 로더 대체하기 와 코루틴 사용은..

  • 지금은 MVVM의 이해가 먼저이기 때문에 직접 테스트하고 글을 작성하기에는 너무 많은 시간이 걸려 다음번에 마저 작성하겠다.
profile
3년차 안드로이드 개발자입니다.

0개의 댓글