Firebase任务尚未完成

时间:2017-09-14 09:32:06

标签: android firebase firebase-authentication kotlin google-signin

我在使用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

中从未出现此错误

3 个答案:

答案 0 :(得分:9)

尝试异步接收结果(通过.addOnSuccessListener{...})或从isSuccessful检查标记Task

答案 1 :(得分:4)

我尝试了上面的答案,但是实现OnSuccessListenerOnCompleteListener并没有给我的调用线程一种等待任务完成的方法。 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