[Android] AAC ViewModel의 생성과 파괴

Hanbin·2021년 9월 8일
1

Android

목록 보기
3/6
post-thumbnail

💡 ViewModel

이 포스팅에서는 AAC ViewModel의 생성과 파괴에 대해 알아볼 것이다.
ViewModel에 대한 자세한 설명은 공식 문서에서 확인할 수 있다.

📋 ViewModel 가져오기

Activity에서 ViewModel을 가져올 때 activity-ktx artifact에 있는 방식 사용.

activity-ktx artifact

Activity가 파괴되기 전까지는 동일한 ViewModel 인스턴스를 보장하는 데 코드를 통해 확인해보자.

by viewModels()

by viewModels()의 내부 코드를 확인해보면 아래 클래스를 return 하고 있다.

코드를 살펴보면 cache된 ViewModel이 없을 경우 ViewModelProviderget() 함수를 통해 ViewModel을 가져와 반환하고 있을 경우 cache된 ViewModel을 반환한다.

Activity에서 ViewModel을 멤버 변수로 가지고 있다면 최초에는 ViewModelProvider를 통해 가져오고 그 이후에는 cache된 ViewModel을 반환할 것이다.

하지만 변수가 onCreate()안에서 선언되어 있다면 onCreate()가 호출될 때마다 cache된 값이 존재하지 않아 ViewModelProviderget() 함수를 통해 가져올 것이다.

ViewModelProvider().get()

mViewModelStore에서 일치하는 ViewModel을 가져온 뒤 인스턴스를 비교해 일치하면 반환하고 아닐 경우 새로 생성한 뒤 mViewModelStore에 저장한다.

ViewModelStore

ViewModelMap형태로 저장하고 있음을 알 수 있다. get(), put() 메서드로 관리하며 clear()메서드는 Map에 저장된 모든 ViewModelclear() 메서드가 호출한 뒤 Map을 비워주는 작업을 하고 있다.

ViewModelProvider에서 사용되는 mViewModelStoreAppCompatActivity 부모인 ComponentActivity에 있는 ViewModelStore를 사용한다.

정리

Activity에서 ViewModel을 가져올 때 최초에는 생성한 뒤 ViewModelStore에 저장한다. 그다음부터는 ViewModelStore에서 일치하는 ViewModel을 반환해 주기 때문에 Acitivty가 파괴되지 않는 이상 동일한 인스턴스의 ViewModel을 보장한다.

💥 ViewModel 파괴

이번엔 ViewModel이 파괴되는 시점을 확인해보자.

ViewModel의 lifecycle

ViewModel의 범위는 ViewModel을 가져올 때 ViewModelProvider에 전달되는 Lifecycle로 지정된다. 예를 들면 Activity에서 생성할 경우 Activity가 끝날 때까지 메모리에 남아있게 된다.

ComponentActivity

다음은 ComponentActivity에 포함된 코드이다.

LifecycleEventObserver을 통해 LifeCycle을 관찰하며ON_DESTROY 상태일 때 해당 코드가 실행된다.

isChangingConfigurations()가 false 일 경우에 아까 살펴본 ViewModelStoreclear() 메서드가 호출되며 생성된 모든 ViewModel이 제거된다.

반대로 isChangingConfigurations() 값이 true 일 경우에는 ViewModel이 제거되지 않을 것이다.

Configuration change

일부 기기 구성은 런타임에 변경될 수 있다.(기기의 화면 회전이나, 언어 설정 등의 이유)
이러한 변경이 일어나는 경우 Android는 실행 중인 Activity를 다시 시작한다. (onDestroy()가 호출되고, 그다음에 onCreate()가 호출됨)

isChangingConfigurations() 조건이 걸려있는 이유는 Configuration change가 발생하여 ActivityonDestroy()가 호출되어도 ViewModel의 인스턴스를 유지하기 위한 처리이다.

정리

ON_DESTROY 시점에 Configuration change가 아닐 경우 ViewModelStoreclear() 메서드가 호출되어 Acitivty에서 생성한 ViewModel이 모두 제거되는 것을 알 수 있었다.

반대로 Configuration change가 변경됐을 때에는 ActivityonDestroy()가 호출되고, 그다음에 onCreate()가 호출되기 때문에 ViewModel 인스턴스 유지를 위해 ViewModelStoreclear()는 실행되지 않는다.

0개의 댓글