【问题标题】:How to properly continue tasks when a given parameter is different当给定参数不同时如何正确继续任务
【发布时间】:2016-10-20 17:58:19
【问题描述】:

我现在正面临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);

【问题讨论】:

    标签: android firebase firebase-authentication


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多