728x90
반응형
https://dalinaum.github.io/coroutines-example/16
이벤트를 Flow로 처리하기
addEventListener 대신 플로우의 onEach를 사용할 수 있습니다.
이벤트마다 onEach가 대응하는 것입니다.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun events(): Flow<Int> = (1..3).asFlow().onEach { delay(100) }
fun main() = runBlocking<Unit> {
events()
.onEach { event -> println("Event: $event") }
.collect() // 스트림이 끈날때까지 기다리게됨.
println("Done")
}
하지만 collect가 플로우가 끝날 때 까지 기다리는 것이 문제입니다.
collect() 가 호출 되어야 onEach가 동작한다. ( 콜드 )
* 이벤트가 계속 발생하는 경우에 감지할수 없다.
* collect가 끈날때까지 ui 작업, 네트워크 호출등아무것도 할수 없다.
launchIn을 사용하여 런칭하기
launchIn을 이용하면 별도의 코루틴에서 플로우를 런칭할 수 있습니다.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun events(): Flow<Int> = (1..3).asFlow().onEach { delay(100) }
fun log(msg : String)= println("{Thread.currentThread().name}: $msg")
fun main() = runBlocking<Unit> { //this : 코루틴 스코프
events()
.onEach { event -> println("Event: $event") }
.launchIn(this)
log("Done") // 코루틴 스코프 ,// 새로운 코루틴 생성
}
실행결과
{Thread.currentThread().name}: Done
Event: 1
Event: 2
Event: 3
collect가 없어지고 launchIn 으로 대체
첫번째인자로 코루틴스코프를 받는다. 그리고 새로운 코루틴을 만들어낸후 onEach를 실행한다.
* 별개의 코루틴에서 이벤트를 관찰하기때문에
UI작업이나, 네트워크 호출을 할수 있다.
* 이벤트와 같이 상태관측이 필요한경우에는 launchIn
728x90
반응형
'Android 공부 > Coroutine' 카테고리의 다른 글
[XX캠퍼스] 18.Kotlin Coroutines & Flow ( 채널 파이프 라인 ) (0) | 2022.07.29 |
---|---|
[XX캠퍼스] 17.Kotlin Coroutines & Flow ( 채널 기초 ) (0) | 2022.07.29 |
[XX캠퍼스] 15.Kotlin Coroutines & Flow ( 완료 처리하기 ) (0) | 2022.07.27 |
[XX캠퍼스] 14.Kotlin Coroutines & Flow ( 예외처리하기 ) (0) | 2022.07.27 |
[XX캠퍼스] 13.Kotlin Coroutines & Flow ( 플래트닝 ) (0) | 2022.07.27 |