Нужна помощь для рефакторинга проверки подлинности телефона FIrebase в архитектуру MVVM - PullRequest
2 голосов
/ 06 июня 2019

Я не могу понять, как обработать Результат входа из класса FirebaseLoginRepository обратно в LoginViewModel после аутентификации, например, успешно ли это или нет, должен ли я использовать прослушиватель обратного вызова, как мы это делаем в шаблоне MVP?

Прошу прощения за недопонимание или нестандартную проблему, так как это мой первый вопрос по StackOverflow

Я не знаю, у меня нет ни малейшей идеи, и я не смог найти ничего полезного в интернете

public void login{

        auth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {

                if(task.isSuccessful()){
                    //using login Result callback as unable to figure out how 
                    //to hand back result to LoginViewModel 
                   //i am certain that doing this breaks the principle of MVVM
                    loginResultCallback.onSuccess();
                }else {
                    loginResultCallback.onError();
                }
            }
        });

}

1 Ответ

0 голосов
/ 06 июня 2019

Предполагая, что вы делаете это в фоновом потоке, вы можете сделать что-то вроде:

public void login{
        CountDownLatch latch = new CountDownLatch(1);
        auth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {

                if(task.isSuccessful()){
                    //using login Result callback as unable to figure out how 
                    //to hand back result to LoginViewModel 
                   //i am certain that doing this breaks the principle of MVVM
                   viewModel.something = something;
                }else {
                    loginResultCallback.onError();
                }
                latch.countDown();
            }
        });
        try {
          latch.await(30000);
        } catch (TimeoutException e) {
          Log.e("TUT", "Error timeed out", e);
        }
}

Это позволяет вам блокировать поток и ждать, пока произойдет обратный вызов, таким образом, это способ абстрагироватьОбратный вызов и использовать LiveData.Вам просто нужно знать, что он делает с потоками.

Помимо этого вы должны посмотреть, есть ли у API Firebase синхронный метод для того же API.

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

...