- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
运行协程时,我遇到了奇怪的锁定(卡住)。有时它工作得很好,有时它会等待并在很长时间后继续运行(或根本不运行)。我不知道如果我的设置不正确,有一些竞争条件,或者我可能误解了协程应该如何使用。应用程序本身不会卡住或崩溃,只是协程停止/暂停执行。
例如,在这个位中 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
的原则.
scope
与
CoroutineScope
没有任何关系启动
getPurchases
这是一个大问题,如果取消外层作用域会发生什么,是取消内协程还是内协程继续消耗资源?
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/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!