android - 应用内更新的 JobCancellationException

标签 android kotlin kotlin-coroutines google-play-core

我注意到一些用户在使用灵活的应用内更新时遇到问题,JobCancellationException: Job was cancelled 被抛出并带有难以理解的堆栈跟踪:

at dalvik.system.VMStack.getThreadStackTrace(VMStack.java)
at java.lang.Thread.getStackTrace(Thread.java:1538)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1063)
at java.lang.Thread.dispatchUncaughtException(Thread.java:1955)

不幸的是,我不知道是代码的哪一部分导致了这个问题。这是唯一的协程相关代码,留在MyViewModel中:

init {
    viewModelScope.launch {
        try {
            appUpdateManager.requestUpdateFlow().collect { appUpdateResult ->
                // Do something with result.
            }
        } catch (e: InstallException) {
            // Do something with an error.
        }
    }
}

fun requestUpdate(fragment: Fragment) {
    viewModelScope.launch {
        try {
            val appUpdateInfo = appUpdateManager.requestAppUpdateInfo()

            appUpdateManager.startUpdateFlowForResult(
                appUpdateInfo,
                AppUpdateType.FLEXIBLE,
                fragment,
                REQUEST_CODE
            )
        } catch (e: IntentSender.SendIntentException) {
        }
    }
}

我怀疑 requestUpdateFlow() 中的代码正在调用 offer 而协程作业已经取消并且我看不到确切的堆栈跟踪,因为 Play Core 库是混淆了吗?

我正在使用以下版本的库:

"com.google.android.play:core:1.7.2"
"com.google.android.play:core-ktx:1.7.0"

最佳答案

JobCancellationException: Job was cancelled 几乎在协程范围内的作业被取消的情况下抛出。

示例:用户转到屏幕 a,在其中调用 api 以获取某些内容。但是用户在 api 未完成时按返回关闭此屏幕。因此,当收到响应时,作业在 -> 异常之前取消。

要更好地处理 JobCancellationException,您可以使用 suspendCancellableCoroutine

更多细节:https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/suspend-cancellable-coroutine.html

关于android - 应用内更新的 JobCancellationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65972435/

相关文章:

android - 防止 Android 上的 Unity 在启动画面上检测用户输入?

java - Kotlin:将 Array 作为 vararg 参数传递时参数类型不匹配

mongodb - KMongo 查询从 Mongo Shell 产生不同的结果

android - 如何测试启动 viewModelScope 协程的 ViewModel 函数?安卓 Kotlin

android - 如何在您自己的 Android 应用程序中使用谷歌帐户?

java - 为什么我们总是在 Android/Java 中输入 cast?

android - 需要关于使用 const 参数覆盖函数的警告

swift - 如何从 Kotlin 移动平台访问 Array 到 iOS 或 Android?

swift - 什么是具体化字符串,而不是 null

android - 为什么 ViewModel 和 Fragment 中的相同变量不同?