ViewModel 3

Mastering Android ViewModels: init {} 블록에서 상태를 초기화하는 것을 피하라

ViewModel의 init {} 블록에서 상태를 초기화하는 것은 편리해보인다.나도 프로젝트에서 종종 그렇게 해 오고는 했는데, 그렇게 하지말라는 이유는 다음과 같다. 1. ViewModel 생성과 강하게 커플링됨데이터를 가져오는 타이밍이 ViewModel 생성시에 있기 때문에, 새로고침 등 사용자 상호작용이나 기타 이벤트에 따라 데이터 로딩시점을 제어하기 어렵게 만든다.  2. 테스트하기 어려움ViewModel이 생성되자마자 데이터 로드가 시작되므로 1번의 이유로 인해 테스트하기 어려워진다.  3. 리소스 낭비의 가능성앱이나 화면에 진입하자마자 데이터를 필요로 하지 않을 경우, 자원의 비효율적인 사용으로 이어질 수 있음. 4. UI 응답성init {} 블록은 최대한 가볍게 유지해야한다. 여기에서 메인 ..

Mastring Android ViewModels: 필요하다면, 생성자에 의존성을 Lazy하게 주입하라

ViewModel의 생성자에 있는 모든 의존성들을 Lazy Inject하라는 것은 아니지만, 드물게 사용하는 것들은 Lazy로 바꿈으로서 초기화 성능을 개선할 수 있다. 의존성이 실제로 필요할때만 주입되므로 이로인한 이점은 다음과 같다. 1. 빠른 시작2. 더 낮은 메모리 점유율3. CPU 부하 감소 Lazy Initialization을 사용해야하는 경우- 규모가 큰 의존성- 드물게 사용되는 의존성- 조건부 의존성 케이스 스터디@HiltViewModelclass BookViewModel @Inject constructor( @IoDispatcher private val ioDispatcher: CoroutineDispatcher, private val bookmarkUseCase: dagger..

[Android] IllegalStateException: Method addObserver must be called on the main thread

문제발생 IllegalStateException: Method addObserver must be called on the main thread ViewModel을 가지고 뭔가 하려했을때 해당 오류가 발생하는 경우가 있다. 이것은 ViewModel을 lazy init해서 사용할 시에 발생하게 되는데, 나의 경우에는 아래와 같은 코드에서 발생했다. private val splashViewModel by viewModels() override fun onStart() { super.onStart() lifecycleScope.launch(Dispatchers.IO) { splashViewModel.doSomething() } } 원인 처음에는 "무슨 소리야 옵저버같은거 안붙였는데"라고 반발이 올라왔지만, 컴..