Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 java.lang.RuntimeException:标记为@UiThread的方法必须在主线程上执行。当前线程:DefaultDispatcher-worker-2_Android_Kotlin_Flutter_Androidx - Fatal编程技术网

Android java.lang.RuntimeException:标记为@UiThread的方法必须在主线程上执行。当前线程:DefaultDispatcher-worker-2

Android java.lang.RuntimeException:标记为@UiThread的方法必须在主线程上执行。当前线程:DefaultDispatcher-worker-2,android,kotlin,flutter,androidx,Android,Kotlin,Flutter,Androidx,我对弗利特和科特林很陌生。我最近在做颤振版本升级(从1.0.0到1.7.8+hotfix4)。在我将kotlin版本升级到1.3.10之后,当我试图启动它时,我的颤振应用程序崩溃了 错误如下所示: [ +521 ms] E/AndroidRuntime( 2726): FATAL EXCEPTION: DefaultDispatcher-worker-2 [+1 ms] E/AndroidRuntime( 2726): Process: XXXXXXXXXXXX, PID: 2726 [

我对弗利特和科特林很陌生。我最近在做颤振版本升级(从1.0.0到1.7.8+hotfix4)。在我将kotlin版本升级到1.3.10之后,当我试图启动它时,我的颤振应用程序崩溃了

错误如下所示:

[ +521 ms] E/AndroidRuntime( 2726): FATAL EXCEPTION: DefaultDispatcher-worker-2
[+1 ms] E/AndroidRuntime( 2726): Process: XXXXXXXXXXXX, PID: 2726 
[        ] E/AndroidRuntime( 2726): java.lang.RuntimeException: Methods marked with @UiThread must be executed on the main thread. Current thread: DefaultDispatcher-worker-2
[        ] E/AndroidRuntime( 2726):     at io.flutter.embedding.engine.FlutterJNI.ensureRunningOnMainThread(FlutterJNI.java:794) 
[   +1 ms] E/AndroidRuntime( 2726):     at io.flutter.embedding.engine.FlutterJNI.invokePlatformMessageResponseCallback(FlutterJNI.java:727) 
[   +1 ms] E/AndroidRuntime( 2726):     at io.flutter.embedding.engine.dart.DartMessenger$Reply.reply(DartMessenger.java:140) 
[   +1 ms] E/AndroidRuntime( 2726):     at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler$1.success(MethodChannel.java:225) 
[   +1 ms] E/AndroidRuntime( 2726):     at XXXXXXXXXXXX.MainActivity$onActivityResult$1.invokeSuspend(MainActivity.kt:91) 
[        ] E/AndroidRuntime( 2726):     at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 
[        ] E/AndroidRuntime( 2726):     at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241) 
[        ] E/AndroidRuntime( 2726):     at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594) 
[        ] E/AndroidRuntime( 2726):     at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60) 
[        ] E/AndroidRuntime( 2726):     at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:740) 
[  +14 ms] D/AutoManageHelper( 2726): onStart true {99992=com.google.android.gms.internal.zzbau$zza@72d039a} 
[ +983 ms] I/CrashlyticsCore( 2726): Crashlytics report upload complete: 5D72013C01D2-0001-0AA6-12B9D92A3973
这是
build.gradle
中的设置:

ext.kotlin_coroutines_version = "1.3.0"
ext.okhttp_version = "3.12.0"

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:$kotlin_coroutines_version"
以下是
MainActivity
中的代码:

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.launch

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    when (requestCode) {
      LOGIN_CODE ->
        if (resultCode == RESULT_OK) {
          if (LoginManager.getInstance().loginService.isLoggedIn) {
            GlobalScope.launch {
              async {
                var ls = LoginManager.getInstance().loginService
                var response = ls.authRequest<AuthResponse<TokenResult>>(AUTH_PROVIDER_NAME)
                return@async response.getToken()
              }.await().let {
                methodResult?.success(it)
              }
            }
          }
        } else {
          methodResult?.success("")
        }

      LOGOUT_CODE ->
        if (resultCode == RESULT_OK) {
          methodResult?.success(true)
        }

      REQUEST_CODE_TAKE_IMAGE_WITH_CAMERA -> {
        if (resultCode != RESULT_OK) {
          methodResult?.success("")
        }
      }

      else -> {
        methodResult?.success(false)
      }
    }
  }
导入kotlinx.coroutines.Dispatchers
导入kotlinx.coroutines.GlobalScope
导入kotlinx.coroutines.async
导入kotlinx.coroutines.launch
重写activityResult(请求代码:Int,结果代码:Int,数据:Intent?){
super.onActivityResult(请求代码、结果代码、数据)
何时(请求代码){
登录代码->
if(resultCode==RESULT\u OK){
if(LoginManager.getInstance().loginService.isLoggedIn){
环球镜发射{
异步的{
var ls=LoginManager.getInstance().loginService
var response=ls.authRequest(身份验证提供者名称)
return@asyncresponse.getToken()
}.等待{
方法结果?成功(it)
}
}
}
}否则{
methodResult?.success(“”)
}
注销代码->
if(resultCode==RESULT\u OK){
methodResult?成功(真)
}
请求\u编码\u拍摄\u图像\u使用\u照相机->{
if(resultCode!=结果\u确定){
methodResult?.success(“”)
}
}
其他->{
方法结果?.success(false)
}
}
}

首先,您应该避免使用全局作用域,它相当于在java中创建线程,您可以阅读更多关于这方面的内容

第二件事是,您应该知道您只能在主线程上修改UI。最有可能的是
methodResult?.success(it)
会进行一些UI更新,因此如果需要快速修复:

GlobalScope.launch {
              async {
                var ls = LoginManager.getInstance().loginService
                var response = ls.authRequest<AuthResponse<TokenResult>>(AUTH_PROVIDER_NAME)
                return@async response.getToken()
              }.await().let {
                withContext(Dispatchers.Main) {
                  methodResult?.success(it)
                }
              }
            }

非常感谢。它解决了我的问题。对不起,
GlobalScope.launch{..}
是我添加的,原来的是
launch{..}
// instead of GlobalScope.launch 
CoroutineScope(Dispatchers.IO).launch {
  // your code goes here
}