본문 바로가기
Android 개발/Architecture 라이브러리

ViewModel에서 Coroutine을 이용하는 방법 #ViewModel Scope

by Developer88 2019. 10. 10.
반응형

Coroutine을 안드로이드에서 사용한다고 했을 때,

ViewModel에서 사용하면 매우 효율적인데요.

오늘은 Coroutine을 ViewModel에서 사용하는 방법에 대해서 정리해 보도록 하겠습니다.

 

Coroutine에 관해 기본적인 내용들은 아래 링크를 참조해 주세요.

>> Kotlin Coroutine에 대한 정리

 

1.  ViewModel 과 Coroutine

Coroutine도 더이상 작업이 필요하지 않거나 할 때,

cancel을 적절히 해주어야 하는데요.

이럴 때 ViewModel과 연계되어 있으면,

ViewModel의 라이프사이클에 맞추어,

쉽게 Coroutine도 관리할 수 있습니다.

 

예전 Coroutine에 관한 글에서도 정리하였지만,

Coroutine의 관리 단위는 Scope입니다.

Scope가 끝나면 그안의 Coroutine들도 모두 끝나게 됩니다.

 

ViewModel에서의 관리도 Scope단위로 생각을 해야 하는데요.

View가 onDestroy일 때, ViewModel은 onClear가 되는데요,

이 때, Scope도 모두 cancel시켜주어야 하는 것이지요.

예를 들면, 네트워크 호출을 했는데, 유저가 해당 Activity 를 떠난다면,

이 때 Scope를 끝내서 모든 비동기 코드도 종료될 수 있도록 해야합니다.

이것을 도와주는 라이브러리가 viewModelScope입니다.

 

2. Library Implement

기존의 ViewModel 라이브러리와 Coroutine의 라이브러리 이외에도,

아래 라이브러리의 implementation 이 필요합니다.

androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0

 

3. viewModelScope

위의 라이브러리 impementation 이 정상적으로 이루어졌다면,

ViewModel에서 아래와 같이, viewModelScope을 쓸 수 있는데요.

 

여기서 사용되는 CoroutineScope는 특별히 관리를 해주지 않아도,

해당 ViewModel이 onClear시에 Coroutine도 모두 취소됩니다.

위에서도 언급하였지만, 어떠한 Coroutine코드도,

비동기로 계속 호출해서 과업이 이어지고 있다고 하더라도,

Scope가 종료되면 다 같이 종료되므로, leak되지 않습니다.

 

 

 

해당 viewModelScope의 소스코드도 가볍게 보고 가도록 하겠습니다.

Closeable을 구현해서, close호출시 coroutineContext를 cancel시키는 것도 보이고 있네요.

 

 

위의 코드에서 viewModelScope는 Dispatchers.Main에 바운드 되어 있다고 하는데요.

그러므로 Main쓰레드에서 실행된다는 것이지요.

만약, 다른 쓰레드에서 실행시키려고 한다면,

withContext()메소드를 이용해 주면 되겠습니다.

 

 

이상으로 viewModelScope에 대해서 알아보았는데요.

실질적으로 저희가 크게 무엇을 해야 한다는 것 보다는,

안드로이드 프레임워크가 ViewModel의 라이프사이클에 맞춰서 관리를 해 준다는 것이므로,

이에 대해서 잘 알아보고 활용하도록 해야겠습니다.

728x90

댓글