我有以下代码,
public CardsController(){
final Map<Integer, Card> temp = new HashMap<>();
for (int i=0; i<CardsInAlbum; i++){
temp.put(i, new Card(i));
}
String uID = FirebaseAuth.getInstance().getUid();
[1]FirebaseFirestore.getInstance()
.collection("albums").document(uID)
.collection("cards").get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
Card c = getCard(document.getData());
Log.d("CardsController", c.getNumber() + "" + " number:" + c.getNumber() + " state:" + c.getState());
[2] temp.put(c.getNumber(), c);
}
} else {
[3] Log.d(Tag, "Error getting documents: ", task.getException());
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
[4] Log.d(Tag, e.getMessage());
}
});
[5]Cards = temp;
}
我在第[1]行到第[5]行设置了断点,在调试它时首先在[1]中停止然后逐行调试似乎它也到达了addOnCompleteListener和addOnFailureListener,但它跳过了[2],[ 3]和[4]。我记得它正在工作(没有对此代码进行任何更改),因此我不知道是否存在来自firebase的某种缓存作为阻止从数据库获取信息的脱机数据库,但我尝试重置模拟器仍然可以没有工作,任何想法为什么会发生这种情况?
PD:检查了logcat,函数中没有记录的消息。
答案 0 :(得分:0)
仅使用OnCompleteListener或使用OnFailureListener和OnSuccessListener组合。
答案 1 :(得分:0)
感谢Bob和Alex帮助我理解firebase异步行为。
我所描述的行为是因为Firebase API的异步性质而发生的,这意味着它在向服务器发出请求时不会阻塞主线程,而是在单独的线程中发出请求并返回它准备好了。
我的错误是在不等待数据库响应的情况下显示活动中的所有值。我必须放置一个加载器动画,而Firebase会返回值。