android - 使用协程在 Android BillingClient 中崩溃
问题描述
我收到通知,我的计费解决方案以一种奇怪的方式崩溃。我无法重现它或找到修复/绕过问题。也许你能帮上忙。
Fatal Exception: java.lang.IllegalStateException: Already resumed
at kotlin.coroutines.SafeContinuation.resumeWith + 45(SafeContinuation.java:45)
at com.android.billingclient.api.BillingClientKotlinKt$querySkuDetails$2$1.onSkuDetailsResponse + 2(BillingClientKotlinKt.java:2)
at com.android.billingclient.api.zzj.run + 8(zzj.java:8)
at android.os.Handler.handleCallback + 907(Handler.java:907)
at android.os.Handler.dispatchMessage + 105(Handler.java:105)
at android.os.Looper.loop + 216(Looper.java:216)
at android.app.ActivityThread.main + 7625(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 524(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main + 987(ZygoteInit.java:987)
//billing
implementation 'com.android.billingclient:billing:2.2.0'
implementation 'com.android.billingclient:billing-ktx:2.1.0'
解决方案
自上周以来,我们运行此代码以防止异常:
suspend fun BillingClient.querySkuDetailsFixed(params: SkuDetailsParams) = suspendCancellableCoroutine<SkuDetailsResult> { continuation ->
querySkuDetailsAsync(params) { billingResult, skuDetails: List<SkuDetails>? ->
if (continuation.isActive) {
// doing some logging
continuation.resumeWith(Result.success(SkuDetailsResult(billingResult, skuDetails)))
} else {
// Already resumed, doing some logging
}
}
}
在日志中,我们看到我们从库中获得了 2 个调用:
第一个响应始终具有 BillingResponseCode -3 SERVICE_TIMEOUT
。
第二个响应通常有 6ERROR
或 2 SERVICE_UNAVAILABLE
。
在我们的例子中,当应用程序在后台被唤醒时,就会发生这种情况PeriodicWorkRequest
。
推荐阅读
- haskell - 将 literate Haskell (.lhs) 转换为 Haskell (.hs)
- r - 在单独的堆积条形图中将分类列条目绘制为总和
- reactjs - FilePond 在 React 上覆盖 server.process
- c# - 检查数组元素是否连续无序
- shell - 为什么tail命令从文件中读取不存在的值?
- aws-cdk - AWS CDK 如何处理假设返回列表而不是字符串的 Fn.getAtt
- java - 没有主键和可为空字段的休眠实体
- python - 复杂类型列的熊猫不兼容形状
- google-bigquery - 在 ON 中使用 CASE 语句进行 LEFT JOIN 时出现 BigQuery 错误
- angular - 使用 AngularFirestore 时如何处理大数据?