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