๐ฒ ์ค๋์ ๊ฐ๋ฐ ์ผ์ง
async์ withContext๋ ๊ธฐ๋ฅ๋ฉด์์๋ ๋์ผํ๋ค. ํ์ง๋ง ์กฐ๊ธ์ ์ฐจ์ด์ ์ด ์๋ค.
- async๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ณ withContext๋ ๊ทธ๋ฌ์ง ๋ชปํ๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13
suspend fun exampleSuspend() { withContext(Dispatchers.IO) { delay(1000) } withContext(Dispatchers.IO) { delay(1000) } withContext(Dispatchers.IO) { delay(1000) } }
withContext๋ ์ ์ฝ๋๊ฐ ๋ชจ๋ ์คํ๋๋๋ฐ 3์ด๊ฐ ๊ฑธ๋ฆฐ๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13
suspend fun test() { CoroutineScope(Dispatchers.IO).async { delay(1000) } CoroutineScope(Dispatchers.IO).async { delay(1000) } CoroutineScope(Dispatchers.IO).async { delay(1000) } }
async๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ธฐ์ ์ฝ๋๊ฐ ๋ชจ๋ ์คํ๋๋๋ฐ๊น์ง 1์ด๊ฐ ๊ฑธ๋ฆฐ๋ค.
async๋ try-catch๋ฌธ์ด ์์ธ๋ฅผ ์ก์ง ๋ชปํ์ง๋ง withContext๋ ์์ธ๋ฅผ ์ก์ ์ ์๋ค.
async๋ exception์ด ๋ฐ์ํ๋ ๋ถ๋ถ์์ try-catch๋ฌธ์ ์ฌ์ฉํด๋ ํด๋น ์ฝ๋ฃจํด์ ์คํ์ํจ CoroutineScope์๋ ์์ธ๊ฐ ์ ๋ฌ๋๋ค.
1 2 3 4 5 6 7 8 9
CoroutineScope(Dispatchers.IO).launch { // 2. ์ฌ๊ธฐ๊น์ง ์๋ฌ๊ฐ ์ ๋ฌ๋๋ค. try { async { throw Exception() // 1. ์ฌ๊ธฐ์ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ฉด } } catch (e: Exception) { println("error catch") } }
๊ทธ๋์ ์ ์ฝ๋๋ ์คํ์ํค์ง ๋ชปํ๊ณ ์ฑ์ด ์ฃฝ์ด๋ฒ๋ฆฐ๋ค.
1 2 3 4 5 6 7 8 9
CoroutineScope(Dispatchers.IO).launch { try { withContext(Dispatchers.Default) { throw Exception() } } catch (e: Exception) { println("error catch") } }
๋ฐ๋ฉด withContext๋ ์์ธ๊ฐ ์ ๋ฌ๋์ง ์์ Exception์ ์ก์๋ธ๋ค.
์ฝํ๋ฆฐ์๋ invoke๋ผ๋ ์ฐ์ฐ์๊ฐ ์กด์ฌํ๋ค.
invoke
์ฐ์ฐ์๋ ์ด๋ฆ ์์ด ํธ์ถ ๋ ์ ์๋ค.1 2 3 4 5 6 7
object MyFunction { operator fun invoke(str: String): String { return str.toUpperCase() // ๋ชจ๋ ๋๋ฌธ์๋ก ๋ฐ๊ฟ์ค } } MyFunction.invoke("hello")
flow ๋๋ฌด ์ด๋ ต๋คใ ใ ใ
flow๋ ์ ์ฐ๋๊ฑธใฒrโฆ.
์๋๋ก์ด๋ ๋ด๋ถ ํจ์์ ์ด๋ฉ์ผ ํ์์ ์ฒดํฌํด์ฃผ๋ ํจ์๊ฐ ์๋ค.
์์ด๋๋ฅผ ์ด๋ฉ์ผ ํ์์ผ๋ก ๋ฐ์์ผํด์ ์ ๊ท์์ ๊ฒ์ํ๋ ์ค ์๊ฒ ๋๋ค.
1 2 3 4 5 6
private fun isCorrectEmailPattern(name: String): Boolean { if (name.isEmpty()) return false return Patterns.EMAIL_ADDRESS.matcher(name).matches() }