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

1

Сейчас я сталкиваюсь с 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);
Теги:
firebase
firebase-authentication

1 ответ

1
Лучший ответ

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню