본문 바로가기

[Android]/Coroutines

[Coroutines 마스터] Coroutine Cancellation 기초

안녕하세요!

 

허접샴푸입니다.

 

오늘은 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) 

 

GitHub - DJDrama/Coroutines

Contribute to DJDrama/Coroutines development by creating an account on GitHub.

github.com

 

 

공감 및 구독해주시면 감사하겠습니다.