Android java.lang.RuntimeException:标记为@UiThread的方法必须在主线程上执行。当前线程:DefaultDispatcher-worker-2
我对弗利特和科特林很陌生。我最近在做颤振版本升级(从1.0.0到1.7.8+hotfix4)。在我将kotlin版本升级到1.3.10之后,当我试图启动它时,我的颤振应用程序崩溃了 错误如下所示: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 [
[ +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
}