gpt4 book ai didi

android - Kotlin 协程锁定/卡住

转载 作者:行者123 更新时间:2023-12-04 07:15:28 26 4
gpt4 key购买 nike

运行协程时,我遇到了奇怪的锁定(卡住)。有时它工作得很好,有时它会等待并在很长时间后继续运行(或根本不运行)。我不知道如果我的设置不正确,有一些竞争条件,或者我可能误解了协程应该如何使用。应用程序本身不会卡住或崩溃,只是协程停止/暂停执行。
例如,在这个位中 scope.launch有时只是不会继续执行到 billingClientDeferred.await()

    override suspend fun getPurchases(): Result<List<Purchase>> = suspendCoroutine { continuation ->
scope.launch {
billingClientDeferred.await().success { client ->
client.queryPurchasesAsync(BillingClient.SkuType.SUBS) Subs@{ billingResultSubs, purchasesSubs ->
if (billingResultSubs.responseCode != BillingClient.BillingResponseCode.OK) {
continuation.resume(Result.Failure.Unknown())
return@Subs
}
continuation.resume(Result.Success(purchasesSubs))
}
}
}
}
scope声明为:
private val scope = CoroutineScope(Job() + Dispatchers.Default)
然后从 WalletManager 调用它
override suspend fun verifyProducts(): Result<Unit> = billingProvider.getPurchases()
.successSuspend { purchases ->
purchases.forEach {
activatePurchase(it)
}
}.map { }
其中到底是从 ViewModel调用的像这样
override fun verify() {
viewModelScope.launch {
userSupervisor.walletManager.mapResult {
it.verifyProducts()
}
}
}
我猜我正在使用的调度程序和范围的组合存在一些问题。我正在用 Dispatchers.Default 尝试不同的东西, Dispatchers.Main , 符合类 CoroutineScope ,使用全局范围,但我总是遇到一些我不完全理解的线程/锁定问题。

最佳答案

第一个问题是您不想从 suspendCoroutine 中启动新的协程。 ,您需要重构您的代码,这样您就不必这样做了。这可以做为

private fun someMethod() = viewModelScope.launch {
val client = billingClientDeferred.await()
val finalResult = getPurchases(client)
}
在此之后只需更新 getPurchases要将客户端作为参数排除并从中删除所有协程代码,只需调用客户端并使用延续返回结果。
您的代码的根本问题是您没有遵循 structured concurrency 的原则.
它本质上是一种并发管理模式,它隐式地负责协程的范围和生命周期。这个想法是,当您使用不同的范围启动协程时,这些范围必须具有父子关系,这允许协程管理系统处理所有情况,例如
  • 当内部协程抛出异常时会发生什么
  • 当外部协程被取消或失败时会发生什么

  • 恐怕您的代码并未真正遵循此模式并且存在以下问题 scopeCoroutineScope没有任何关系启动 getPurchases这是一个大问题,如果取消外层作用域会发生什么,是取消内协程还是内协程继续消耗资源?
    您正在从挂起函数启动协程
    正如 Roman Elizarov 解释的那样 here

    Suspending functions, on the other hand, are designed to benon-blocking and should not have side-effects of launching anyconcurrent work. Suspending functions can and should wait for alltheir work to complete before returning to the caller.

    关于android - Kotlin 协程锁定/卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68798407/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com