본문 바로가기

[Android]/Coroutines

[Coroutines 마스터] Dispatchers.Main vs Dispatchers.Main.immediate

안녕하세요~! 오랜만에 다시 돌아왔습니다.

 

부연 설명 없이 단순 명료하게 글을 작성하도록 하겠습니다.

 

Coroutine을 사용할 때 Dispatchers.Main과 Dispatchers.Main.immediate의 차이는 무엇일까요?

매우 간단합니다. 아래 예제를 봅시다.

 

1) Dispatchers.Main 을 사용할 시

[결과]

testDispatchersMain() 함수를 호출하면, 결과는 아래와 같이 나옵니다.

일반적으로 코드는 Top-Down 방식으로 진행이 되죠.

그래서 위 코드를 보면, 예상된 결과는 Zero -> First -> Second 일 것입니다.

하지만 Zero -> Second -> First가 출력되었습니다.

 

2) Dispatchers.Main.immediate을 사용할 시

 

[결과]

testDispatchersMainImmediate() 함수를 호출하면, 결과는 아래와 같이 나옵니다.

Dispatchers.Main.immediate을 사용하니 Zero -> First -> Second 가 출력되었습니다.

기대한 대로 결과가 나왔습니다.

 

[결론]

순서를 보장해야할 경우 Dispachers.Main.immediate을 사용하세요.

Dispatchers.Main은 단순히 Context Switching에서 필요할 경우 사용하면 됩니다.

예를 들어 Dispatchers.IO을 사용하는 CoroutineScope 내에서는 withContext을 이용하여 Context Switching이 가능한데, 

withContext(Dispatchers.Main)을 사용하나 withContext(Dispatchers.Main.immediate)을 사용하나 결과는 동일하기에 이럴 경우 Dispatchers.Main을 사용하면 됩니다.

 

[부가 설명]

Android에서는 lifecycleScope을 사용하여 굳이 Activity나 Fragment내에서 coroutineScope을 직접 생성하여 사용하지 않아도 됩니다.

[결과]

lifecycleScope을 사용하였을 때 Dispatchers.Main.immediate을 사용하였을 때와 같은 결과가 출력되었습니다.

이 이유는 무엇일까요?

Lifecycle.kt
Lifecycle.kt

LifecycleScope을 타고 들어가면 Lifecycle.kt 파일을 읽기 전용으로 볼 수 있습니다.

위 그림에서 나와 있듯이 LifecycleScope은 Dispatchers.Main.immediate에 묶여있다고 나와 있습니다.

 

이렇기 때문에, lifecycleScope을 사용해도 순서는 보장이 되는 것입니다.

Dispatchers.Main을 사용할 경우, 순서가 보장되지 않기 때문에 방대한 코드를 작성할 경우 잦은 실수가 발생할 수 있습니다.

굳이 순서 보장이 필요하지 않으면 무엇을 사용하던 상관이 없지만, 대부분의 프로그래머라면 순서를 체크하면서 결과를 예상하면서 코드를 짤 것이라고 생각합니다.

 

LifecycleScope을 사용하던지 Distpatchers.Main.immediate을 사용하여 다른 팀원들이 자신의 코드를 보았을 때 의도가 무엇이고 정확하게 전달할 수 있도록 합시다!

 

[Github]

https://github.com/DJDrama/Coroutines/tree/Main-vs-Main.immediate

 

GitHub - DJDrama/Coroutines

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

github.com

Github에서 위 코드를 받아보실 수 있습니다.