-
ViewModel 클래스는 lifecycle를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되었다. ViewModel 클래스를 사용하면 화면 회전과 같이 구성을 변경할 때도 데이터를 유지할 수 있다.
ViewModel 생명주기
ViewModel은 Activity에서는 Activity가 끝날 때까지 그리고 Fragment에서는 Fragment가 분리될 때까지 메모리에 남아 있다.

Activity의 경우 기기 화면이 회전될 때와 같이 onCreate() 메서드가 여러 번 호출될 수 있지만 ViewModel은 소멸되지 않고 계속 유지된다. ViewModel은 ScopeOwner가 Destroyed 상태가 되면 onCleared()를 호출하여 ViewModel을 Release한다.ViewModel 구현하기
ViewModel 라이브러리는 내부적으로 프래그먼트를 사용한다.
ViewModel은 추상클래스(abstract)이며 상속만으로 ViewModel클래스 생성가능하다class MainViewModel : ViewModel() { override fun onCleared() { // Do somthing to clean up ... } }ViewModel을 생성하기 위해서는 ViewModel Provider 객체가 필요하다. 일반적으로 ViewModelProvider의 생성하기 위해 생성자 매개변수로 ViewModelStoreOwner와 ViewModelProvider.Factory가 필요하다.
class MainActivity : AppCompatActivity() { private lateinit var viewModel:MainViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //ViewModel 인스턴스 생성 viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()) .get(MainViewModel::class.java) } }
생성자가 없는 ViewModel을 인스턴스화 하는 경우에만 간단히 NewInstanceFactory 클래스를 사용하고, 그 외에는 직접 ViewModelProvider.Factory를 구현해야 한다.ViewModel 주의사항
- ViewModel내부에 activity, fragment, view에 대한 context를 저장해서는 안된다
: ViewModel의 Lifecycle은 외부에 존재하기때문에 Memory leak을 발생시키는 직접적인 원인이 될 수 있다.
다만 Application context를 저장하는 것은 문제가 되지 않는다. Application context전체 앱의 수명주기를 의미하기 때문에 Memory leak에 영향을 주지 않으며 이런 용도를 위해 AndroidViewModel 클래스를 제공합니다.
AndroidViewModel은 다음과 같이 인스턴화 할 수 있다.viewModel = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory(application)) .get(MainViewModel::class.java)- ViewModel은 기기의 구성이 변경될때만 유지된다.
: BackButton이나 , 최근목록에서 앱을 종료했을때는 어떠한 처리도 기대할 수 없다.
References
'Android' 카테고리의 다른 글
Android Kotlin Fundamentals - ViewModel(2) (0) 2021.05.30 Android Kotlin Fundamentals - ViewModel(1) (0) 2021.05.29 Navigation Component(2) (0) 2021.05.19 Navigation Component(1) (0) 2021.05.18 SurfaceView (0) 2021.05.13