App/Android Native
Flow/Coroutines in Android/Kotlin
Agrafenaaa
2023. 5. 11. 12:06
collect() != collectLatest()
collect() => It collects every value that theoriginal flow emits and it is recommended to use when all received data should be processed.
collectLatest() => It collects every value, but stops to work for the previous value when the original flow emits a new value. It is fairly for the case when the latest data should be processed.
val countFlow = flow<Int> {
val startingVal = 5
var currVal = startingVal
emit(startingVal)
while(currVal > 0 ) {
delay(1000L)
currVal--
emit(currVal)
}
}
private fun collectFlow() {
viewModelScope.launch {
// It prints only once - "The current count is 0".
countFlow.collectLatest {cnt ->
delay(1300L)
println("The current count is $cnt")
}
// It prints a log every sec.
countFlow.collect {cnt ->
delay(1300L)
println("The current count is $cnt")
}
}
}
.buffer() / .conflate()
buffer() => flows emissions via channel of a specified capacity and runs collector in a sperate coroutine
conflate() => flow emissions via conflated channel and runs collector in a specified coroutine. Emitter is NEVER suspended due to a slow collector, but collector always gets the most recent value emitted.
private fun collectFlow() {
val flow = flow {
delay(200L)
emit("Coleslaw")
delay(700L)
emit("Burger")
delay(500L)
emit("Ice Cream")
}
viewModelScope.launch {
flow.onEach {
Log.d(Tag, "$it is served.")
}
.buffer()
// .conflate()
.collect{
Log.d(Tag, "$it is being eaten.")
delay(1500L)
Log.d(Tag, "$it is eaten.")
}
}
}
collect() | buffer() + collect() | conflate() + collect() | collectLatest() |
Coleslaw is served | Coleslaw is served | Coleslaw is served | Coleslaw is served |
Coleslaw is being eaten | Coleslaw is being eaten | Coleslaw is being eaten | Coleslaw is being eaten |
Coleslaw is eaten | Burger is served | Burger is served | X |
Burger is served | Ice Cream is served | Ice Cream is served | Burger is served |
Burger is being eaten | Coleslaw is eaten | Coleslaw is eaten | Burger is being eaten |
Burger is eaten | Burger is being eaten | X | X |
Ice Cream is served | Burger is eaten | X | Ice Cream is served |
Ice Cream is being eaten | Ice Cream is being eaten | Ice Cream is being eaten | Ice Cream is being eaten |
Ice Cream is eaten | Ice Cream is eaten | Ice Cream is eaten | Ice Cream is eaten |