💡 Flow 는 비동기식으로 계산할 수 있는 데이터 스트림으로 여러 값을 순차적으로 내보낼 수 있다.
- 생산자 : 스트림에 추가되는 데이터 생산
- 중개자 : 스트림에 내보내는 값이나 스트림을 수정
- 소비자 : 스트림 값을 사용
1. Flow 생성
- flow { } 로 생성 가능
- 데이터 전달을 위해서 emit() 함수를 사용하고
- emitAll() 를 통해 다른 데이터도 방출 가능
- asFlow()를 이용하면 array, iterator, range등도 flow로 변환 가능.
private fun getNumbers(): Flow<Int> = flow {
for (i in 1..100) {
emit(i)
println("Emit $i") // 1 ~ 100 까지 방출
}
emitAll((101 .. 200).asFlow()) // 101 ~ 200 까지 방출
}
- 일반 함수와 suspend 함수도 asFlow를 사용하면 flow로 변환 가능.
fun getStr(): String = "String"
fun getFlowStr(): Flow<String> = ::getStr.asFlow()
suspend fun getSuspendStr(): String = "String"
fun getFlowSuspendStr(): Flow<String> = ::getSuspendStr.asFlow()
2. 데이터 요청
- 데이터 요청을 위한 함수는 collect, collectIndexed(index 추가로 받음), collectlatest, launchIn 가 있다.
(1..3).asFlow().collect {
delay(100)
println("$it")
}
❗️ 에러 발생했을 경우
- catch 함수로 예외처리 가능
flowOf(1, 2, "Three", 3)
.onEach { check(it !is String) { "It is Not Number" } }
.catch { println(it) }
.collect {
println(it)
}
'안드로이드' 카테고리의 다른 글
[안드로이드] Activity vs Fragment 차이 (0) | 2022.10.09 |
---|---|
[안드로이드] ViewBinding 사용시 주의점 (0) | 2022.10.07 |
[안드로이드] LiveData vs Flow 차이점 (0) | 2022.10.05 |
[안드로이드] 안드로이드 DialogFragment() 화면 사이즈 조정 (0) | 2022.10.04 |
[코틀린] 코틀린 - 고차함수 (1) | 2022.10.03 |