kotlin - StateFlow 与应用程序的生命周期相关,但没有 GlobalScope(Android、协程)

标签 kotlin kotlin-coroutines

在协程世界中,GlobalScope 似乎非常不受欢迎。我自己遇到了很多问题,尤其是在单元测试中(例如 onEach changes the dispatcher in StateFlow (kotlin coroutines) )。

无论如何,我想知道我可以用什么来代替某些 StateFlows,这些 StateFlows 通常应该比单个 View 模型的生命周期更长等。考虑一些单例存储库,它保留一些状态以供不同 View 模型使用( UDF 风格)。它应该在应用程序的整个生命周期中保持该状态。像这样的事情:

class CartManager(
    private val cartService: CartService,
    dispatchers: DispatcherProvider
) {

    private val cartRefreshChannel = Channel<Unit>()

    val cartFlow = cartRefreshChannel
        .receiveAsFlow()
        .conflate()
        .onStart { emit(Unit) }
        .map { cartService.requestCart() }
        .flowOn(dispatchers.io())
        .stateIn(GlobalScope, SharingStarted.WhileSubscribed(), null)

    suspend fun addItemToCart() {
        cartService.addItemToCart()
        cartRefreshChannel.send(Unit)
    }

    //there should be some error handling and retrying here, generally the cartFlow should never cancel / fail

}

我可以在这里使用什么来代替 GlobalScope 来保持相同的功能而不被 GlobalScope 怪癖所困扰?

最佳答案

您应该使用存储在 Application 类中的 MainScope 而不是 GlobalScope

class MyApplication {
   val applicationScope = MainScope()
}

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-main-scope.html

关于kotlin - StateFlow 与应用程序的生命周期相关,但没有 GlobalScope(Android、协程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64824335/

相关文章:

android - 从挂起函数异常返回对象

android - Kotlin Coroutine SupervisorJob 取消行为

Java/ Kotlin : Why does Jackson parse dates differently from SimpleDateFormat?

java - Kotlin与Proguard的反射(reflection)失败

java - 在 Kotlin 中扩展泛型类

kotlin - kotlin-react useEffect中如何订阅StateFlow

android - 如果我在Android中使用协程读写Realm以避免阻塞UI,是否还需要使用后台线程?

android - 将 Firebase 与 Kotlin 协程一起使用

type-conversion - kotlin - 数字类型的自动转换

android - 保持声音在App内播放,但在App进入后台时停止播放