Android 공부/Coroutine

[XX캠퍼스] 16.Kotlin Coroutines & Flow ( 런칭 )

Machine_웅 2022. 7. 27. 14:56
728x90
반응형

https://dalinaum.github.io/coroutines-example/16

 

플로우 런칭

플로우 런칭 예제 78: 이벤트를 Flow로 처리하기 addEventListener 대신 플로우의 onEach를 사용할 수 있습니다. 이벤트마다 onEach가 대응하는 것입니다. import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun e

dalinaum.github.io

 

이벤트를 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
반응형