오늘은  Coroutine을 안드로이드에서 활용하는 방법을 정리해 보겠습니다.

이제 어느정도 Coroutine에 대한 감을 잡았는데,

실제로 활용하는 것에 대해서는 조금 낯선감이 있는데요.

하나씩 해보면서 익혀보도록 하겠습니다.

 

Coroutine에 대한 기본적인 부분은 아래 글을 참조해 주세요.

 

1. Worker쓰레드에서 작업후 UI 쓰레드에 반영하기

먼저 버튼을 누르면 네트워크를 호출해서 값을 반영한다고 가정해 보겠습니다.

withContext함수를 이용하면 쓰레드 전환을 쉽게 하면서 Blocking된 작업의 결과값을 받을 수 있는데요.

이럴경우는 아래와 같이, withContext를 활용해서 Worker쓰레드에서 작업해야 할 부분만,

Context를 변경해서 값을 받아와서 text를 ui에 넣어주면 됩니다.

 

 

물론 위에서와 반대로 Scope를 IO로 잡고, 호출할 때 withContext를 Main으로 할 수도 있는데요.

각각의 장단점이 있지만,

안드로이드의 View컨트롤러인 Activity에서 작업을 할 때만큼은,

되도록 Main을 최상단 Scope로 놓고 작업하는 것이 에러를 발생시킬 확률도 줄이고 효율적인 것 같습니다.

 

추가적으로, suspend함수에서 UI를 set해야하는 경우가 있는 경우가 있을텐데요. 

Dispatcher를 명시적으로 쓰지않고, 사용했다가 불러서 사용하는 CoroutineScope가 Main이 아닌경우에는,

Exception이 생길 수 있습니다.

이럴때는, withContext를 사용하여 Context를 Main으로 명시적으로 해 주는 것이 좋을 것 같습니다.

 

2. Timeout 구현

로딩을 하거나 네트워크 호출을 하는 경우,

응답이 되지 않는 시간이 길어지면 유저에게 TIMEOUT을 표시해 주어야 하는데요.

Coroutine에서는 이와 관련한 API를 제공해 주어서, 쉽게 표현할 수 있습니다.

 

핵심은 withTimeoutOrNull이라는 함수인데요.

아래와 같이 인자로 시간을 넣어주면 됩니다.

긴 코드들을 함수하나로 확 줄여줄 수 있는거지요.

 

 

 

3. Job의 생성과 관리

 

job을 생성하고 invokeOnCompletion이라는 함수를 사용할 수 있는데요.

이것은 job이 완료 되었을 때 호출되는 메세지 입니다.

 

 

위에서 생성한 job은 아래와 같이 상태를 확인하고 cancel할 수 있으며,

cancel 할 때 특정한 Exception메세지를 넘겨줄 수 있습니다.

그럼 위에서 invokeOnCompletion에서 특정한 Exception에 따라서 다른 반응을 보여줄 수도 있는 것 이지요.

 

4. job전체가 아닌, 해당 scope만 cancel하고 싶을경우

해당 scope의 child job들만 cancel시키고 싶을때는 어떻게 해야할까요>

 

 

 

 

 

Coroutine은 어떻게 해주는 것이 좋을까요?

쉽게 job.cancel()을 생각하기 쉬운데요.

 

 

 

 

 

 

 

 

 

 

 

 

728x90

+ Recent posts