플로우 컨텍스트
예제 59: 플로우는 코루틴 컨텍스트에서
플로우는 현재 코루틴 컨텍스트에서 호출 됩니다.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")
fun simple(): Flow<Int> = flow {
log("flow를 시작합니다.")
for (i in 1..10) {
emit(i)
}
}
fun main() = runBlocking<Unit> {
launch(Dispatchers.IO) {
simple()
.collect { value -> log("${value}를 받음.") }
}
}
예제 60: 다른 컨텍스트로 옮겨갈 수 없는 플로우
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")
fun simple(): Flow<Int> = flow {
withContext(Dispatchers.Default) {
for (i in 1..10) {
delay(100L)
emit(i)
}
}
}
fun main() = runBlocking<Unit> {
launch(Dispatchers.IO) {
simple()
.collect { value -> log("${value}를 받음.") }
}
}
예제 61: flowOn 연산자
flowOn
연산자를 통해 컨텍스트를 올바르게 바꿀 수 있습니다.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")
fun simple(): Flow<Int> = flow {
for (i in 1..10) {
delay(100L)
log("값 ${i}를 emit합니다.")
emit(i)
}
}.flowOn(Dispatchers.Default)
fun main() = runBlocking<Unit> {
simple().collect { value ->
log("${value}를 받음.")
}
}