Firebase匿名登录抛出Task未完成异常,寻求排查帮助
从你提供的异常栈和代码来看,问题的根源不在FirebaseAuthLiveData的onComplete方法里,而是在你的Activity的LiveData观察者回调中——具体来说,你在PriorInfoContentActivity.kt:124行的onChanged方法里,调用了某个Firebase Task的getResult(),但这个Task此时并没有完成,所以抛出了IllegalStateException: Task is not yet complete异常。
为什么会出现这个问题?
你的FirebaseAuthLiveData逻辑是没问题的:onComplete回调只有在Task真正完成后才会触发,而且你已经通过p0.isSuccessful判断了任务成功,此时p0.result.user是安全可用的。但你的Activity观察者里,可能错误地持有了未完成的Task实例,并尝试调用它的getResult(),而不是直接使用LiveData传递过来的Resource<FirebaseUser>中的用户对象。
具体修复步骤
- 检查Activity的观察者代码
找到PriorInfoContentActivity中signInAnonymouslyWithFirebase方法里的LiveData观察者逻辑,确保你没有在回调里调用某个Task的getResult()。正确的写法应该是直接使用LiveData传递过来的资源对象:
// 正确示例:只处理LiveData传递的Resource数据 firebaseAuthLiveData.observe(this) { resource -> when (resource.status) { Resource.Status.SUCCESS -> { val currentUser = resource.data // 这里直接使用currentUser即可,不需要再操作Task } Resource.Status.ERROR -> { val errorMsg = resource.message // 处理登录失败逻辑 } } }
错误的写法可能类似这样(你需要避免这种情况):
// 错误示例:错误地持有Task并调用getResult() val signInTask = firebaseAuth.signInAnonymously() firebaseAuthLiveData.observe(this) { // 这里的signInTask可能还没完成,调用getResult()会抛异常 val result = signInTask.result }
确认FirebaseAuthLiveData的逻辑正确性
你的FirebaseAuthLiveData代码是合理的:onComplete回调触发时Task已经完成,p0.isSuccessful为true时p0.result肯定是可用的,这部分不需要修改。关于重启后自动登录的说明
重启应用后自动登录是Firebase Auth的正常行为:匿名用户的会话会被Firebase持久化存储,重启后FirebaseAuth.getInstance().currentUser会直接存在,不需要再次调用signInAnonymously()。
内容的提问来源于stack exchange,提问作者Syed Musaddiq Faraz

