안녕하세요!
허접샴푸입니다.
오늘은 Coroutine Cancellation에 대해서 매우 짧고 간단한 글을 작성해볼까 합니다.
[질문]
돌고 있는 Coroutine을 어떻게 취소시킬 수 있을까요?
- 예제를 같이 봐봅시다.
<예제 1 - 작업이 완료되면 Toast 띄우기>
[코드]
이전 포스트와 같은 코드이며, 단순히 runTime() 함수 내에서 실행이 끝나면 Toast를 띄우도록 하였습니다.
[실행화면]
[문제점]
위 실행화면을 보면, 홈 버튼을 클릭하여 바탕화면으로 이동을 하였음에도 불구하고, 앱 내의 Toast가 띄워집니다.
이러면 Ux적으로 문제겠죠?
홈 화면으로 화면 전환을 하였으면 해당 작업은 취소가 되어서 Toast가 띄워지면 안 되는데 말이죠.
[방향]
이를 해결하기 위해 Coroutine을 Cancel 해보도록 합시다.
물론, Coroutine을 Cancel 하기 위한 방법은 여러 가지 입니다만 Cancellation에 대해서는 추후에 자세하게 다룰 것이기에 지금은 천천히
알아보도록 합시다.
<예제 2 - 홈 화면으로 이동 시 해당 Coroutine을 취소>
[코드]
- Job 타입 Nullable 변수를 생성한 다음, 실행되어야 할 Coroutine에 대한 Reference를 Job으로 반환해주는 launch를 통해 job 변수에 assign 해줍니다.
- 그럼 onStop() 오버라이딩 함수 내에서 해당 job을 cancel 시켜주면 끝입니다!
[실행화면]
홈 화면으로 화면 전환 시, Toast가 띄워지지 않으며, 앱으로 돌아가면 해당 Coroutine은 Cancel 되어 실행되어야 할 동작이 멈춰있는 상태로 남아있습니다.
[결론]
Coroutine launch를 통해 반환받은 Job을 Cancel 함으로써 Coroutine을 쉽게 Cancel 할 수 있다는 것을 알았습니다.
물론 job?. cancel()을 통해서 해당 coroutine을 취소하면, 해당 coroutine이 다시 (버튼 클릭을 통해) 실행될 수 있도록 조치를 취해야 합니다.
Coroutine을 Cancel 하게 되면 CancellationException이 발생하게 되는 데 이때 처리를 하면 됩니다.
이에 대해선 다음 포스트에서 자세히 다루도록 하겠습니다.
[Github] 코드를 받아보세요.
https://github.com/DJDrama/Coroutines/tree/Job-Cancel-(Basics)
공감 및 구독해주시면 감사하겠습니다.
'[Android] > Coroutines' 카테고리의 다른 글
[Coroutines 마스터] Coroutine Cancellation 상세 처리 (0) | 2021.09.27 |
---|---|
[Coroutines 마스터] 흔히 하기 쉬운 실수(CountDown Timer) (0) | 2021.09.22 |
[Coroutines 마스터] Dispatchers.Main vs Dispatchers.Main.immediate (0) | 2021.09.21 |