Android Firebase: как OnCompleteListener работает асинхронно, если он вызывается в основном потоке приложения? - PullRequest
0 голосов
/ 25 апреля 2019

Я написал код для создания новой учетной записи с помощью Firebase Auth:

public static int signUp(String email, String password) {
  mAuth.createUserWithEmailAndPassword(email, password)
      .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
          if (task.isSuccessful()) {
            Log.i("accountMessage", "User has registered successfully!");
          } else {
            try {
              throw task.getException();
            } catch (FirebaseAuthUserCollisionException e) {
              Log.i("accountMessage", "User is registered already!");
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        }
      });

  Log.i("accountMessage", "I want that this message works lastest!");
}

Я могу поймать accountMessage с помощью LogCat. Обычно я должен сначала увидеть сообщение "User is registered already!", но сначала я его не вижу: Android LogCat accountMessage Я видел в API Google для Android , что OnCompleteListener вызывается в главном потоке приложений, но я не могу понять, что если OnCompleteListener вызывается в основном потоке приложений (я знаю, что основной поток приложений - это тот же поток пользовательского интерфейса) на Android), как это работает асинхронно? Разве он не должен работать синхронно, если он работает в главном потоке приложения? Я имею в виду, разве мы не должны увидеть сначала "User is registered already!", затем "I want that this message works lastest!" сообщение? Есть ли способ, чтобы OnCompleteListener работал в потоке пользовательского интерфейса синхронно, если он работает асинхронно?


Редактировать 2:

Фактически, асинхронная операция onComplete заставляет res[0] в следующем коде возвращаться из метода signUp, прежде чем ему будет присвоено значение в onComplete:

public static int signUp(String email, String password) {
  final int[] res = new int[1];
  mAuth.createUserWithEmailAndPassword(email, password)
      .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
          if (task.isSuccessful()) {

            res[0] = 123;

            // We can't use 'return 123;' in here...

          }
        }
      });

  // You can see that value of res[0] is "0", because not given "123" value.
  // Must be: First, given "123" value to res[0], after then return res[0];
  return res[0];
}

1 Ответ

1 голос
/ 25 апреля 2019

Работа происходит вне основного потока, чтобы не блокировать ваше приложение.Затем обратный вызов onComplete запланирован на основной поток, так что вы обновляете пользовательский интерфейс без необходимости переключения контекста самостоятельно.

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