Rin*_*nav 9 android kotlin firebase firebase-authentication google-signin
我在退出Firebase后使用FirebaseAuth.getInstance().signOut();并再次登录后随机获取以下异常
我试图在用户成功通过身份验证后从FirebaseUser获取令牌
signUpRequest.firebaseToken = user.getIdToken(true).result?.token
user是身份验证后收到的FirebaseUser
E/AndroidRuntime: FATAL EXCEPTION: main
Process: agrahyah.keen, PID: 12082
java.lang.IllegalStateException: Task is not yet complete
at com.google.android.gms.common.internal.zzbp.zza(Unknown Source)
at com.google.android.gms.tasks.zzn.zzbic(Unknown Source)
at com.google.android.gms.tasks.zzn.getResult(Unknown Source)
at com.xxxActivity.makeSignUpRequest(xxxActivity.kt:129)
at com.xxxActivity.access$makeSignUpRequest(xxxActivity.kt:36)
at com.xxxActivity$signInAnonymously$1.onComplete(xxxActivity.kt:94)
at com.google.android.gms.tasks.zzf.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Run Code Online (Sandbox Code Playgroud)
我正在使用Firebase android sdk版本11.2.2.以前版本的Firebase SDK中从未出现此错误
小智 8
我尝试了上面的答案,但实现OnSuccessListener或OnCompleteListener不给我的调用线程一种等待任务完成的方法。task.getResult应该等待,但由于某种原因,它偶尔会退出,除了上面的例外。
最后,下面的代码似乎已经修复了它:
tokenTask = firebaseUser.getIdToken(false);
Tasks.await(tokenTask);
@NotNull GetTokenResult tokenResult = Objects.requireNonNull(tokenTask.getResult());
Run Code Online (Sandbox Code Playgroud)
简而言之,我明确地等待任务完成,然后调用task.getResult. 只调用Tasks.await(tokenTask)而不调用task.getResult似乎也不起作用,因为Tasks.await(tokenTask)似乎在任务完成之前以某种方式退出。我不确定为什么调用两者都有效。
顺便说一下,在调试器中放置断点会使代码工作,因为它给了任务完成的时间,所以这有点难以调试。
我使用Google Play Services 的 Kotlin+Coroutine 扩展解决了这个问题:
// gradle
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.3.6'
}
Run Code Online (Sandbox Code Playgroud)
// gradle
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.3.6'
}
Run Code Online (Sandbox Code Playgroud)