Android Firebase addOnCompleteListener未执行onComplete且addOnFailureListener未执行onFailure

时间:2018-02-17 06:06:25

标签: android firebase firebase-realtime-database

我有以下代码,

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,函数中没有记录的消息。

2 个答案:

答案 0 :(得分:0)

仅使用OnCompleteListener或使用OnFailureListener和OnSuccessListener组合。

答案 1 :(得分:0)

感谢Bob和Alex帮助我理解firebase异步行为。

我所描述的行为是因为Firebase API的异步性质而发生的,这意味着它在向服务器发出请求时不会阻塞主线程,而是在单独的线程中发出请求并返回它准备好了。

我的错误是在不等待数据库响应的情况下显示活动中的所有值。我必须放置一个加载器动画,而Firebase会返回值。