作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一段代码来使用 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!");
}
我可以使用 LogCat 捕获 accountMessage
。通常我必须首先看到 “用户已注册!”
消息,但是我无法先看到它: 我在Google APIs for Android上看到过OnCompleteListener
在主应用程序线程上调用,但我无法理解如果 OnCompleteListener
在主应用程序线程上调用(我知道主应用程序线程与 Android 上的 UI 线程相同),如何它是异步工作的吗?如果它在主应用程序线程上工作,它不应该同步工作吗?我的意思是,我们不应该先看到“用户已注册!”,然后再看到“我希望此消息最新有效!”消息吗?如果 OnCompleteListener 异步工作,是否有办法在 UI 线程上同步工作?
编辑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];
}
最佳答案
该工作发生在主线程之外,因此不会阻塞您的应用程序。然后,onComplete
回调会安排到主线程,以便您更新 UI,而无需自己进行上下文切换。
关于java - Android Firebase : How is OnCompleteListener working asynchronously if it called on main application thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55854800/
我是一名优秀的程序员,十分优秀!