Coroutine ViewModelScope 에 대하여

probehub·2022년 2월 16일

android coroutine

목록 보기
6/7

코루틴을 공부하던중 무의식적으로 사용하던 viewModelScope 에 대해서 궁금해졌다. viewModelScope 로 묶으면 유저가 해당 view를 벗어났을때 백그라운드 작업도 다 취소가 되는게 맞는걸까?

찾아보니 반드시 그런게 아니다. viewModelScope 는 ViewModel 을 확장한 객체와 수명주기를 같이한다. 그리고 viewModel 의 생명주기는 viewModel을 인스턴스화 할때 ViewModelProvider 에게 파라미터로 넘겨주었던 owner 를 따라간다.

만약 owner를 fragment 로 지정했다면 fragment 가 화면에서 내려갈때 viewModelScope 도 닫히게 된다. 하지만 requireActivity() 를 호출하여 owner 를 activity 로 설정(viewModel 수준에서 activity와 framgnet 간 데이터를 공유하기 위해)했다면, viewModelScope 의 수명주기는 activity의 수명주기를 따라가고, fragment 가 activity 에서 detach 되었음에도 불구하고 백그라운드 프로세스는 유효하게 동작한다.

의도적으로 activity에 귀속시킨 viewModel이 아니라면 불필요하게 네트워크 자원이 낭비될 수 있으며, 예기치 못한 오류가 발생할 수 있다. 이러한 점을 인지하고 fragment onPause 등에서 백그라운드 작업을 cancel 해줄 필요가 있다.

직접 테스트를 해보았다.

테스트는 테스트용 프레그먼트에 들어가마자 viewModel 에서 10초뒤 HELLO 가 출력되는 백그라운드 프로세스를 실행시키고, 프레그먼트를 나가는 것이다.

(1) owner 가 activity 일때

(2) owner 가 fragment 일때

위의 내용과 정확히 일치했다.

profile
개발자

0개의 댓글