Как правильно продолжить задачи, когда данный параметр отличается

#android #firebase #firebase-authentication

#Android #firebase #firebase-аутентификация

Вопрос:

Прямо сейчас я сталкиваюсь с задачами, и у меня есть сомнения. После регистрации по электронной почте / pass мне пришлось обновить профиль пользователя. Итак, я впервые попробовал это:

 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);
  

Ответ №1:

Похоже, вы ожидаете, что AuthResult будет передан непосредственно в monsigninsucccesslistener. В данном конкретном случае, на мой взгляд, не стоит пытаться принудительно выполнить дополнительное продолжение, чтобы вернуть искомое значение.

Вместо того, чтобы пытаться организовать передачу AuthResult этому слушателю в качестве параметра, слушатель может просто обратиться непосредственно к MainTask.GetResult(), или вы можете сохранить AuthResult в переменной-члене и получить к нему доступ таким образом. В любом случае, это безопасно, потому что mOnSignInSuccessListener будет вызван только после завершения MainTask, что гарантирует готовность AuthResult.