我在使用FirebaseAuth.getInstance().signOut();
退出Firebase并再次登录
我正在尝试在用户成功通过身份验证后从FirebaseUser获取令牌
signUpRequest.firebaseToken = user.getIdToken(true).result?.token
用户是身份验证后收到的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)
我正在使用Firebase android sdk版本11.2.2
。以前版本的Firebase SDK
答案 0 :(得分:9)
尝试异步接收结果(通过.addOnSuccessListener{...}
)或从isSuccessful
检查标记Task
。
答案 1 :(得分:4)
我尝试了上面的答案,但是实现OnSuccessListener
或OnCompleteListener
并没有给我的调用线程一种等待任务完成的方法。 task.getResult
应该等待,但是由于某些原因,它会异常退出,上面有一个例外。
最后,以下代码似乎已将其修复:
tokenTask = firebaseUser.getIdToken(false);
Tasks.await(tokenTask);
@NotNull GetTokenResult tokenResult = Objects.requireNonNull(tokenTask.getResult());
简而言之,我明确地等待任务完成,然后调用task.getResult
。仅调用Tasks.await(tokenTask)
而不调用task.getResult
似乎也不起作用,因为Tasks.await(tokenTask)
似乎以某种方式在任务完成之前退出。我不确定为什么两者都起作用。
顺便说一句,在调试器中放置一个断点会导致代码正常工作,因为它可以给任务时间完成任务,因此调试起来有些困难。
答案 2 :(得分:2)
我使用Kotlin+Coroutine extensions for Google Play Services解决了这个问题:
// gradle
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.3.6'
}
// code
val token = user.getIdToken(true).await().token