我现在正面临tasks,我对此表示怀疑。电子邮件/通行证注册后,我必须更新用户的个人资料。所以我首先尝试了这个:

FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password);
    .continueWithTask(new Continuation<AuthResult, Task<Void>>() {
        @Override
        public Task<Void> then(@NonNull Task<AuthResult> t) throws Exception {
            UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                .setDisplayName(fullname)
                .build();
            return t.getResult().getUser().updateProfile(profileUpdates);
        }
    })
    .addOnFailureListener(this, mOnSignInFailureListener)
    .addOnSuccessListener(this, mOnSignInSuccessListener); // <- problem!


问题出在最后一行,我的侦听器等待一个AuthResult参数,但是updateProfile任务发送一个Void。我像波纹管一样处理这种情况,但似乎太混乱了。告诉我是否还有另一种更好的方法可以做到这一点:

final Task<AuthResult> mainTask;
mainTask = FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password);
mainTask
    .continueWithTask(new Continuation<AuthResult, Task<Void>>() {
        @Override
        public Task<Void> then(@NonNull Task<AuthResult> t) throws Exception {
            UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                .setDisplayName(fullname)
                .build();
            return t.getResult().getUser().updateProfile(profileUpdates);
        }
    })
    .continueWithTask(new Continuation<Void, Task<AuthResult>>() {
        @Override
        public Task<AuthResult> then(@NonNull Task<Void> t) throws Exception {
            return mainTask;
        }
    })
    .addOnFailureListener(this, mOnSignInFailureListener)
    .addOnSuccessListener(this, mOnSignInSuccessListener);

最佳答案

您似乎希望将AuthResult直接传递给mOnSignInSuccessListener。在我看来,在这种特殊情况下,尝试强制执行额外的Continuation以返回您要查找的值是不值得的。

不必尝试将AuthResult作为参数传递给该侦听器,而是可以直接将侦听器直接访问mainTask.getResult(),或者可以将AuthResult保存在成员变量中并以这种方式访问​​它。无论哪种方式,它都是安全的,因为仅在mainTask完成后才调用mOnSignInSuccessListener,以确保AuthResult准备就绪。

10-04 10:21