์ฝ๋ฃจํด Coroutine
๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ ์ฝ๋๋ฅผ ๊ฐ์ํํ๊ธฐ ์ํด Android์์ ์ฌ์ฉํ ์ ์๋ ๋์ ์ค๊ณ ํจํด.
- ๊ฒฝ๋ : ๋จ์ผ ์ค๋ ๋์์ ๋ง์ ์ฝ๋ฃจํด์ ์คํํ ์ ์๋ค. ์ ์ง
- ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ์
- ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋๋ ์ทจ์ ์ง์
- Jetpack ํตํฉ
์ฅ๊ธฐ ์คํ ์์ ๊ด๋ฆฌ
suspend
: ํ์ฌ ์ฝ๋ฃจํด ์คํ์ ์ผ์์ค์งํ๊ณ ๋ชจ๋ ๋ก์ปฌ ๋ณ์๋ฅผ ์ ์ฅresume
: ์ ๊ธฐ๋ ์์น๋ถํฐ ์ ์ง๋ ์ฝ๋ฃจํด์ ๊ณ์ ์คํ
๊ธฐ๋ณธ ์์ ์ ์ํด ์ฝ๋ฃจํด ์ฌ์ฉ
๋์คํจ์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ ๋ ํ์ธ.
์ฝ๋ฃจํด์ ์์ฒด์ ์ผ๋ก ์ ์ง๋ ์ ์์ผ๋ฉฐ ๋์คํจ์ฒ๋ ์ฝ๋ฃจํด ์ฌ๊ฐ๋ฅผ ๋ด๋น.
- Dispatchers.Main : ๊ธฐ๋ณธ Android ์ค๋ ๋. UI์ ์ํธ์์ฉํ๊ณ ๋น ๋ฅธ ์์ ์ ์คํํ๊ธฐ ์ํด์๋ง ์ฌ์ฉํด์ผ ํจ.
- Dispatchers.IO : ๊ธฐ๋ณธ ์ค๋ ๋ ์ธ๋ถ์์ ๋์คํฌ ๋๋ ๋คํธ์ํฌ I/O๋ฅผ ์คํํ๋๋ก ์ต์ ํ.
- Dispatchers.Default : CPU๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ์์ ์ ๊ธฐ๋ณธ ์ค๋ ๋ ์ธ๋ถ์์ ์คํํ๋๋ก ์ต์ ํ. ์) ๋ชฉ๋ก ์ ๋ ฌ, JSON ํ์ฑ
withContext()์ ์ฑ๋ฅ
์์ํ๋ ์ฝ๋ฐฑ ๊ธฐ๋ฐ ๊ตฌํ์ ๋นํด ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ์ง ์๋๋ค. ์ผ๋ถ ์ํฉ์์๋ ๋ฅ๊ฐํ๋ค. withContext()๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๋๋ผ๋ ๋์ผํ ๋์คํจ์ฒ์ ์ ์ง๋๊ณ ์ค๋ ๋๊ฐ ์ ํ๋์ง ์๋๋ค. ๊ฐ๋ฅํ ํ ์ค๋ ๋ ์ ํ์ ๋ฐฉ์งํ๋๋ก Dispatchers.Default
์ Dispatchers.IO
๊ฐ์ ์ ํ์ ์ต์ ํ.
์ฝ๋ฃจํด ์์
launch
: ์ ์ฝ๋ฃจํด์ ์์ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์๋๋ค. '์คํ ํ ์ญ์ ' ์์ .async
: ์ ์ฝ๋ฃจํด์ ์์ํ๊ณawait
๋ผ๋ ์ ์ง ํจ์๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋๋ก ํ์ฉ. ๋ค๋ฅธ ์ฝ๋ฃจํด ๋ด๋ถ์์๋ง ์ฌ์ฉํ๊ฑฐ๋ ์ ์ง ํจ์ ๋ด์์ ๋ณ๋ ฌ ๋ถํด๋ฅผ ์คํํ ๋ ์ฌ์ฉ. [!] await ํธ์ถ์ ์ผ๋ถ๋ก ์์ธ๋ฅผ ๋ฐ์. ์ผ๋ฐ ํจ์๋await
๋ฅผ ํธ์ถํ ์ ์์ผ๋ฏ๋ก ์๋์ผ๋ก ์์ธ ์ญ์ ํ์ฌ ๊ธฐ๋ก๋์ง ์๋๋ค.
๋ณ๋ ฌ ๋ถํด
suspend
ํจ์ ๋ด์์ ์์๋๋ ๋ชจ๋ ์ฝ๋ฃจํด์ ํจ์๊ฐ ๋ฐํ๋๋ฉด ์ค์ง๋์ด์ผ ํจ. ๋ฐํ ์ ์ await
ย ๋ฅผ ํธ์ถํด ์๋ฃ๋ฅผ ๋ณด์ฅํด์ผ ํ ์ ์์.
CoroutineScope
launch
๋๋ async
๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ ์ฝ๋ฃจํด์ ์ถ์ ํ๋ค. ์งํ ์ค์ธ ์์
(์คํ ์ค์ธ ์ฝ๋ฃจํด)์ ์ธ์ ๋ ์ง scope.cancel()
์ ํธ์ถํ์ฌ ์ทจ์ ๊ฐ๋ฅ.
KTX ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํน์ ์๋ช
์ฃผ๊ธฐ ํด๋์ค์ ์์ฒด CoroutineScope๋ฅผ ์ ๊ณต. (viewModelScope, lifecycleScope ๋ฑ)
References
- https://developer.android.com/kotlin/coroutines/coroutines-adv?hl=ko