티스토리 뷰
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 |
'App > Android Native' 카테고리의 다른 글
[Android Native] Firebase dynamic link for AOS above 13 - does not open an app directly, it redirects only to playstore (0) | 2023.04.12 |
---|---|
Jetpack Navigation Component w SafeArgs (0) | 2022.01.14 |
Unsplash API w MVVM/Retrofit2/Hilt/Navigation (0) | 2022.01.14 |
KOTLIN - Flows (0) | 2022.01.10 |
Simple CryptocurrencyApp Clone w Clean Architecture (0) | 2022.01.05 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- flutter_storage_not_working_for_the_first_time
- mvvm
- android_domain
- flutter_secure_storage_issue_iOS
- laravel9
- AndroidWirelessDebug
- Android
- Kotlin
- RunAFlutterProjectIniPhoneFromVSCode
- android_app_links
- querydslQclass
- querydslKotlinError
- Laravel
- retrofit_toJson()_error
- flutter
- querydsl5.0.0jakarta
- FirebaseConfigurationForMultipleBuildTypes
- dagger-hilt
- android_app_links_domain
- android_app_link_domain_works_with_adb_but_not_works_with_browser
- MultipleFirebaseEnvironments
- retrofit_generator
- phplaravel
- futter_api
- WirelessDebug
- flutter_android_app_links
- FlutterWirelessDebuginAOS
- KotlinFlow
- unsplashAPI
- retrofit_generator_conflicts_with_freezed
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함