오늘도 더 나은 코드를 작성하였습니까?

ViewModel 구현 본문

Android Jetpack Architecture/ViewModel

ViewModel 구현

hik14 2020. 8. 18. 16:09

* AndoridViewModel vs ViewModel

 

AndroidViewModel 클래스는 ViewModel의 하위 클래스이다. 유사하며 UI 관련 데이터를 저장하고 관리하도록 설계되어 데이터를 준비하고 제공해야 합니다. UI의 경우에도 구성 변경 시에도 데이터가 자동으로 유지된다.

AndroidViewModel과의 유일한 차이점은 응용 프로그램 콘텍스트와 함께 제공되므로 시스템 서비스를 받기 위해 콘텍스트가 필요하거나 비슷한 요구 사항이 있는 경우 유용하다.

context에 대한 작업이 필요한것이 아니면 일반적인 ViewModel클래스를 상속받아서 이용할 것을 권장하고 있다.

 

 

아키텍처 구성요소는 UI의 데이터 준비를 담당하는 UI 컨트롤러에 ViewModel 도우미 클래스를 제공한다. ViewModel 객체는 구성이 변경되는 동안 데이터를 자동으로 보관되므로, 이러한 객체가 보유한 데이터는 다음 Activity/ Frament 인스턴스에서 즉시 사용할 수 있습니다.

 

예를 들어 앱에서 사용자 목록을 표시해야 한다면 다음 샘플 코드에 설명된 대로 사용자 목록을 확보하여 Activity/ Frament 대신 ViewModel에 보관하도록 책임을 할당해야 합니다.

 

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.

            // 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
            })
        }
    }

만약 Acitivtiy 가 재생성 되더라도 최초에 생성한 MyViewModel 인스턴스를 그대로 가져와서 사용한다. 

ViewModel을 생성한 컴포넌트가 소멸을 해야 ViewModel의 onCleared()가 호출되고 이 곳 에러 리소스가 정리된다.

 

ViewModel의 수명은 View 나 Activity/Fragment(lifecycleOwner)보다 오래 지속되도록 설계되었으며

View 및 LifeCycleOwn에 대한 의존성이 없기 때문에 단위 테스트를 편리하게 작성할 수 있다.

 

ViewModel 내부에서 생명주기 이벤트를 구현하도록 LifecycleObserver를 포함할 순 있지만,

ViewModel 내부에서 LiveData 및 Observable 한 데이터를 변경사항을 관찰해서는 안된다.