Метод, возвращающий значение до запуска кода для обновления значения - PullRequest
0 голосов
/ 09 мая 2018

В приведенном ниже примере я вызываю метод signinUser(username, password) Затем он запускается через Firebase, чтобы определить, смог ли пользователь успешно или неудачно войти в систему. Однако для этого требуется Firebase небольшое количество времени, что к этому времени метод уже вернулся с исходным значением, прежде чем он был обновлен в соответствии с успешностью / неуспешностью процесса входа в систему.

Как бы я мог вернуть метод после того, как аутентификация Firebase сделала это? Я знаю, что мог бы включить таймер при вызове оператора return, однако я не уверен, как это будет работать, так как медленное подключение к Интернету может привести к тому, что оно займет больше времени, чем заданное таймером количество.

Мой код выглядит следующим образом:

public AuthSuccess signinUser(String username, String password) {
        mAuth.signInWithEmailAndPassword(username + "@debugrestaurant.com", password)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            Toast.makeText(context, "Successful!", Toast.LENGTH_SHORT).show();
                            authSuccess = new AuthSuccess(true, null);
                        } else {
                            Toast.makeText(context, "Unsuccessful!", Toast.LENGTH_SHORT).show();
                            authSuccess = new AuthSuccess(false, task.getException());
                            Toast.makeText(context, "Exception: " + authSuccess.getException().getLocalizedMessage(), Toast.LENGTH_SHORT).show();
                        }
                    }
                });
        return authSuccess;
    }

Обратите внимание, что класс AuthSuccess - это просто объект, который я создал, чтобы собрать, был ли вход успешным, а если нет, чтобы собрать исключение.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Ваш старый код, вероятно, что-то вроде этого

public void onSignInClick(){
    AuthSuccess result = signinUser(username, password);
    if(result.success){
        startMainActivity();
    }else{
        showErrorPopUp();
    }
}

Измените это на:

public void onSignInClick(){
    signinUser(username, password);
}
protected void handleLoginResult(AuthSuccess result){
    if(result.success){
        startMainActivity();
    }else{
        showErrorPopUp();
    }
}

И в самом конце вашего onComplete метода сделайте:

handleLoginResult(authSuccess);
0 голосов
/ 09 мая 2018

Вы не можете вернуть то, что еще не было загружено.Другими словами, вы не можете просто использовать объект authSuccess вне метода onComplete(), поскольку он всегда будет null из-за асинхронного поведения этого метода.Это означает, что к тому времени, когда вы пытаетесь вернуть этот результат за пределы этого метода, данные еще не закончили загрузку из базы данных, и поэтому они недоступны.Быстрое решение этой проблемы - использовать значение authSuccess только внутри метода onComplete(), в противном случае я рекомендую вам увидеть последнюю часть моего ответа из этого сообщения в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова.Вы также можете взглянуть на это видео для лучшего понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...