안드로이드/Android 비동기 처리

[Android] 코루틴 플로우(Coroutine Flow)에 대해 알아보자

코딩하는후운 2024. 3. 26. 16:16
반응형

Android 코루틴 플로우(Coroutine Flow)에 대해 알아보자

# flow { ... }

public fun <T> flow(@BuilderInterface block: suspend FlowCollector<T>.() -> Unit)
    : Flow<T> = SafeFlow(block)

flow {
    // 플로우 블럭
}
  • 하나의 소비자(Consumer)에게 값을 보냅니다.
  • 생성된 이후에 누군가 소비하기 시작하면 데이터를 발행합니다.

# 플로우 기초

플로우 기초

 

플로우 기초

플로우 기초 예제 45: 처음만나보는 플로우 Flow는 코틀린에서 쓸 수 있는 비동기 스트림입니다. import kotlin.random.Random import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun flowSomething(): Flow<Int> = flow { r

dalinaum.github.io

 

# 플로우 연산자 타입

1. 플로우 중간 연산자 (Intermediate flow operators)

  • 중간 연산자도 마찬가지로 플로우와 같이 콜드(Cold) 타입으로 동작
  • 중간 연산자는 suspend(중단)함수가 아니기에 새롭게 변환된 플로우를 즉시 반환 (지연 x)
  • 중간에서 값을 소비하지 않고도 데이터 스트림을 수정할 수 있음
  • filter, map ..

2. 변환 연산자 (Transform operator)

  • transform 연산자는 중간 연산자(map, filter) 같이 단순한 변환 보다 복잡한 변환을 처리위한 연산자
  • 변환 연산자(transform)은 예시처럼 emit()을 추가하여 요소마다 여러개의 변환이 가능
  • transform

3. 플로우 종단 연산자 (Terminal flow operator)

  • 플로우 수집을 시작하는 종단 함수(대표적으로 collect)
  • count, collect, reduce

 

# 플로우 연산

플로우 연산

 

플로우 연산

플로우 연산 예제 49: 플로우와 map 플로우에서 map 연산을 통해 데이터를 가공할 수 있습니다. import kotlin.random.Random import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun flowSomething(): Flow<Int> = flow { repe

dalinaum.github.io

 

# 플로우 컨텍스트

  • 플로우는 현재 코루틴 컨텍스트에서 호출

플로우 컨텍스트

 

플로우 컨텍스트

플로우 컨텍스트 예제 59: 플로우는 코루틴 컨텍스트에서 플로우는 현재 코루틴 컨텍스트에서 호출 됩니다. import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun log(msg: String) = println("[${Thread.currentThr

dalinaum.github.io

 

Android의 Kotlin 흐름  |  Android 개발자  |  Android Developers

Android의 Kotlin 흐름 코루틴에서 흐름은 단일 값만 반환하는 정지 함수와 달리 여러 값을 순차적으로 내보낼 수 있는 유형입니다. 예를 들면 흐름을 사용하여 데이터베이스에서 실시간 업데이트

developer.android.com

 

# 플로우 버퍼

  • 생산자와 소비자가 흐름이 동일한 타이밍에 만들어지고 소비되는 것이 아님 -> 유연한 흐름 필요

플로우 버퍼링

 

플로우 버퍼링

플로우 버퍼링 예제 62: 버퍼가 없는 플로우 보내는 쪽과 받는 쪽이 모두 바쁘다고 가정해봅시다. import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import kotlin.system.* fun simple(): Flow<Int> = flow { for (i in

dalinaum.github.io

  • Collect & CollectLastest

collect와 collectLatest의 차이

 

[Coroutine Flow] collect와 collectLatest의 차이는 무엇인가?

collect를 사용한 데이터 소비의 한계점 Flow는 Coroutine상에서 Reactive한 프로그래밍을 할 수 있도록 만들어진 데이터 파이프 라인이다. Flow는 데이터를 발행하는 역할을 하며 Flow에서 발행하는 데이

kotlinworld.com

 

# 플로우 결합

플로우 결합하기

 

플로우 결합하기

플로우 결합하기 예제 66: zip으로 묶기 zip은 양쪽의 데이터를 한꺼번에 묶어 새로운 데이터를 만들어 냅니다. import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun main() = runBlocking<Unit> { val nums = (1..3)

dalinaum.github.io

 

# 플로우 플래트닝

플로우 플래트닝하기

 

플로우 플래트닝하기

플로우 플래트닝하기 예제 68: flatMapConcat 플로우에서는 3가지 유형의 flatMap을 지원하고 있습니다. flatMapConcat, flatMapMerge, flatMapLatest입니다. flatMapConcat은 첫번째 요소에 대해서 플레트닝을 하고 나

dalinaum.github.io

 

# 플로우 예외처리

플로우 예외처리하기

 

플로우 예외처리하기

플로우 예외처리하기 예제 71: 수집기 측에서 예외처리하기 예외는 collect을 하는 수집기 측에서도 try-catch 식을 이용해 할 수 있습니다. import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun simple(): Fl

dalinaum.github.io

플로우 완료처리하기

 

플로우 완료처리하기

플로우 완료처리하기 예제 75: 명령형 finally 블록 완료를 처리하는 방법 중의 하나는 명령형의 방식으로 finally 블록을 이용하는 것입니다. import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun simple()

dalinaum.github.io

 

# 플로우 런칭

public suspend fun Flow<*>.collect(): Unit = collect(NopCollector)

public fun<T>Flow<T>.launchIn(scope: CoroutineScope): Job = scope.launch{
    collect() // tail-call
}
  • 이벤트를 처리할때는 launchIn을 사용한다.

플로우 런칭

 

플로우 런칭

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

dalinaum.github.io

 

 

참조 : 스터디그룹

반응형