Я написал код для создания новой учетной записи с помощью 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!"
, но сначала я его не вижу:
Я видел в 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];
}