Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果在协同程序中引发异常,那么在应用程序崩溃时在Android Studio中查看异常堆栈跟踪的最佳方法是_Android_Android Studio_Kotlin_Kotlin Coroutines - Fatal编程技术网

如果在协同程序中引发异常,那么在应用程序崩溃时在Android Studio中查看异常堆栈跟踪的最佳方法是

如果在协同程序中引发异常,那么在应用程序崩溃时在Android Studio中查看异常堆栈跟踪的最佳方法是,android,android-studio,kotlin,kotlin-coroutines,Android,Android Studio,Kotlin,Kotlin Coroutines,当我的应用程序在普通代码中崩溃时,我可以在Android Studio中打开“运行”选项卡,查看我的应用程序崩溃的确切原因。但是,如果导致我的应用程序崩溃的异常是在协同程序中抛出的,我在选项卡上看不到任何内容。我的project\Android Studio配置中是否有遗漏 唯一可以看到异常堆栈跟踪的地方是我手机上应用程序崩溃对话框中的“查看摘要”链接 Logcat显示TaskCancelledException,没有特别的内容,并且仅当我删除“仅显示选定的应用程序”过滤器时才显示 我已经找到了

当我的应用程序在普通代码中崩溃时,我可以在Android Studio中打开“运行”选项卡,查看我的应用程序崩溃的确切原因。但是,如果导致我的应用程序崩溃的异常是在协同程序中抛出的,我在选项卡上看不到任何内容。我的project\Android Studio配置中是否有遗漏

唯一可以看到异常堆栈跟踪的地方是我手机上应用程序崩溃对话框中的“查看摘要”链接

Logcat显示TaskCancelledException,没有特别的内容,并且仅当我删除“仅显示选定的应用程序”过滤器时才显示

我已经找到了解决办法,但我怀疑这是否是最有效、最惯用的方法。这是密码

// Storebase.kt
@Suppress("unused")
abstract class StoreBase(private val thisLifecycle: Lifecycle, private val context: CoroutineContext = Dispatchers.IO): CoroutineScope, LifecycleObserver, LifecycleOwner {

    init {
        @Suppress("LeakingThis")
        thisLifecycle.addObserver(this)
    }

    private val handler = CoroutineExceptionHandler { _, throwable ->
        Log.e("ERROR", "Coroutine has thrown an exception")
        Exception(throwable).printStackTrace()
        throw throwable
    }

    private val compositeJob = Job()
    override val coroutineContext: CoroutineContext
        get() = context + compositeJob + handler

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() {
        compositeJob.cancel()
        thisLifecycle.removeObserver(this)
    }

    override fun getLifecycle(): Lifecycle {
        return thisLifecycle
    }
}
我的格拉德尔酒店

android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m -Dkotlinx.coroutines.debug=on

“logcat选项卡上有什么显示吗?”维维克米什拉问得好。将有关logcat的信息添加到我的post@Skizo-奥兹ᴉʞS,我会仔细阅读的,谢谢。请记住,恢复的协程堆栈跟踪与第一次暂停之前的原始跟踪完全不同。这在很大程度上是毫无价值的,您可以得到恢复后返回的那些函数的反向跟踪,并且没有关于它们调用函数的信息。