Android 将带有协同路由的代码内联到button.setOnClickListener的内部会导致应用程序崩溃

Android 将带有协同路由的代码内联到button.setOnClickListener的内部会导致应用程序崩溃,android,kotlin,verifyerror,Android,Kotlin,Verifyerror,这是我试图实现的一些代码的摘要 button.setOnClickListener { showSomeAnimation() CoroutineScope(Dispatchers.IO).launch { // this line is UserActivity.kt:138 someNetworkTasks() withContext(Dispatchers.Main) { updateUI() }

这是我试图实现的一些代码的摘要

button.setOnClickListener {
    showSomeAnimation()

    CoroutineScope(Dispatchers.IO).launch { // this line is UserActivity.kt:138
        someNetworkTasks()
        withContext(Dispatchers.Main) {
            updateUI()
        }
    }
}
但是,一旦按下按钮,就会出现java.lang.VerifyError:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.diy.drift, PID: 25461
    java.lang.VerifyError: Verifier rejected class com.diy.drift.UserActivity$onCreate$$inlined$forEachIndexed$lambda$1$1: java.lang.Object com.diy.drift.UserActivity$onCreate$$inlined$forEachIndexed$lambda$1$1.invokeSuspend(java.lang.Object) failed to verify: java.lang.Object com.diy.drift.UserActivity$onCreate$$inlined$forEachIndexed$lambda$1$1.invokeSuspend(java.lang.Object): [0xDB] 'this' argument 'Uninitialized Reference: com.diy.drift.UserActivity$onCreate$$inlined$forEachIndexed$lambda$1$1$4 Allocation PC: 217' not instance of 'Precise Reference: com.diy.drift.UserActivity$onCreate$$inlined$forEachIndexed$lambda$1$1$3' (declaration of 'com.diy.drift.UserActivity$onCreate$$inlined$forEachIndexed$lambda$1$1' appears in /data/app/com.diy.drift-fU12pqcCpebCBPw2Tcgk-w==/base.apk!classes2.dex)
        at com.diy.drift.UserActivity$onCreate$$inlined$forEachIndexed$lambda$1.onClick(UserActivity.kt:138)
        at android.view.View.performClick(View.java:6612)
        at android.view.View.performClickInternal(View.java:6581)
        at android.view.View.access$3100(View.java:785)
        at android.view.View$PerformClick.run(View.java:25904)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:280)
        at android.app.ActivityThread.main(ActivityThread.java:6706)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
我认为我的代码可能会有一些错误,异常没有被打印出来,因为代码在lambda中。因此,我将button.setOnClickListener中的所有代码提取到一个函数中,以查看我的代码的问题如下:

fun foo() {
    showSomeAnimation()

    CoroutineScope(Dispatchers.IO).launch {
        someNetworkTasks()
        withContext(Dispatchers.Main) {
            updateUI()
        }
    }
}

button.setOnClickListener {
    foo()
}
但它毫无例外地运行得非常好。为什么这种奇怪的事情会发生在我身上?

试试使用

GlobalScope.launch {
            someNetworkTasks()
        }
updateUI()

希望这能有所帮助

这真是出乎意料!您的代码是否包含ForAchindexed循环?您能否创建一个示例项目来演示这一点(设置kotlinx协同程序需要花费大量精力)是的,我使用ForAchineDexed为4个按钮设置相同的操作。例如:ForAchineDexed{button.setOnClickListener{…}