티스토리 뷰
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
- Android
- Laravel
- mvvm
- RunAFlutterProjectIniPhoneFromVSCode
- retrofit_toJson()_error
- MultipleFirebaseEnvironments
- futter_api
- Kotlin
- unsplashAPI
- flutter_android_app_links
- flutter
- querydslKotlinError
- flutter_secure_storage_issue_iOS
- phplaravel
- AndroidWirelessDebug
- FirebaseConfigurationForMultipleBuildTypes
- retrofit_generator_conflicts_with_freezed
- dagger-hilt
- android_app_links_domain
- android_app_link_domain_works_with_adb_but_not_works_with_browser
- android_app_links
- flutter_storage_not_working_for_the_first_time
- android_domain
- KotlinFlow
- retrofit_generator
- querydslQclass
- laravel9
- querydsl5.0.0jakarta
- FlutterWirelessDebuginAOS
- WirelessDebug
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함