우리는 보통 ViewModel을 생성할 때 ViewModel()을 상속받아 사용한다.
그래서 일반적으로 ViewModel에서는 Context에 직접 접근하지 않는다.
ViewModel의 주요 목적이 UI와 비즈니스 로직을 분리하기 위한 것이기 때문이다.
이를 통해서 UI의 생명주기에 영향을 받지 않고 독립적으로 데이터를 유지할 수 있게 된다.
하지만 특정 상황에서는 ViewModel에서 Context에 접근해야하는 경우가 발생하다.
이 때 생성자 파라미터로 받거나 객체를 생성해서 받는 것은 올바른 방법이 아니다.
AndroidViewModel 클래스를 사용해서 해결이 가능한데, 이는 Application Context를 파라미터로 받고 이것을 통해 리소스나 시스템 서비스를 사용할 수 있게 된다.
class HelloViewModel(application: Application) : AndroidViewModel(application) {
fun getCustomString(id: Int): String {
return getApplication<Application>().resources.getString(id)
}
}
위 예시에서는 AndroidViewModel을 상속받고, getApplication 메서드를 사용하여 ApplicationContext에 접근할 수 있게 되었다.
Application Context를 사용하되, 액티비티나 프래그먼트 Context는 사용하면 안된다.
직접 참조하는 경우에 ViewModel의 생명주기가 View보다 길기 때문에 독립적으로 돌아가던 각각의 생명주기가 꼬일 수 있고, View가 모두 종료되어도 ViewModel이 계속해서 참조하게 된다면 메모리 누수가 발생할 수 있기 때문이다.
'개발 > Android' 카테고리의 다른 글
[안드로이드] 클린 아키텍처 - (1) 개념 (0) | 2023.05.16 |
---|---|
[안드로이드] 오픈소스 라이선스 고지 (0) | 2023.05.10 |
[안드로이드] AAC ViewModel과 MVVM ViewModel (0) | 2023.03.26 |
[안드로이드] Glide를 알아보자 (0) | 2023.01.12 |
RxJava SubscribeOn & ObserveOn (0) | 2022.10.18 |