Java Firebase onDataChanged调用了很多次(没有更新),有时调用空值

Java Firebase onDataChanged调用了很多次(没有更新),有时调用空值,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我的firebase应用程序中有以下json树 --ashWoYViS3SbHtBhLpvStRleBl13 ----items -------- -KxDDW1FYMUOxea5w5ii ------------- description: "gggh" ------------- name: "gggh" ashWoYViS3SbHtBhLpvStRleBl13是用户ID,通过FirebaseAuth.getInstance().getUser().getUid()获取 和-kxddw1f

我的firebase应用程序中有以下json树

--ashWoYViS3SbHtBhLpvStRleBl13
----items
-------- -KxDDW1FYMUOxea5w5ii
------------- description: "gggh"
------------- name: "gggh"
ashWoYViS3SbHtBhLpvStRleBl13是用户ID,通过FirebaseAuth.getInstance().getUser().getUid()获取

和-kxddw1fymuoxea5wii是项的键,在将项插入json树之前通过push函数获得

“项目”节点下有更多项目,这只是一个示例

然后我想阅读所有项目,在我的应用程序列表中显示它们。我做了以下工作:

ValueEventListener listener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List<Item> items= utils.convertChildrenToList(dataSnapshot, Item.class);
            getView().setData(customContexts);
            getView().showContent();

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            getView().showError(databaseError.toException(), true);

        }


    };


    Query query = database.getReference("/ashWoYViS3SbHtBhLpvStRleBl13/items")
            .orderByKey();
    query.addValueEventListener(listener);
ValueEventListener=新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
List items=utils.convertChildrenToList(dataSnapshot,Item.class);
getView().setData(自定义上下文);
getView().showContent();
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
getView().batherRor(databaseError.toException(),true);
}
};
Query Query=database.getReference(“/ashwoyvis3sbhtbhlpvstrebl13/items”)
.orderByKey();
query.addValueEventListener(listener);
此时列表中有5项,在使用addValueEventListener设置侦听器之后,我希望在onDataChanged中只收到一次结果。真正发生的事情是,每隔几秒钟我就会收到无限个对onDataChanged的调用。快照第一次包含5项。第二次快照为空(null)。第三次快照在无限循环中再次包含5项,以此类推

数据库没有被更新,因为我不明白为什么我在onDataChanged中变成了不止一个回调。数据总是在那里,我也不明白为什么快照的值有时是空的

如果改用addListenerForSingleValueEvent,则在回调“onDataChanged”中只收到一个结果。有时快照值为空,有时快照包含5个元素。无论如何,这并不能解决我的问题

我尝试了很多版本的Firebase sdk,从v11.0.2到Firebase 11.4.2,所有版本都有

解决我发现的问题的唯一方法是如下

而不是为路径注册侦听器

“/ashwoyvis3sbhtbhlpvstrbl13/items”,我为路径注册了一个侦听器

“/some_prefix/ashWoYViS3SbHtBhLpvStRleBl13/items”(显然,我也使用相同的前缀保存数据)

然后所有的工作都如预期的那样,也就是说,我只收到回调“onDataChanged”中的结果。快照不是空的,只有当items节点下的数据真正更改时,我才会收到下一次回调

或者,如果我使用addListenerForSingleValueEvent,那么我只会收到一个回调,其中包含节点“items”中的所有元素

你能告诉我我做错了什么吗?(因为我不想在用户id之前使用前缀)


提前感谢。

每次您要进行查询时,请将获取的设置为false,以确保onDatachange读取了该方法,但当onDatachange中的方法意外调用onDatachange时,由于获取的设置为true,因此无法访问该方法。
例如,当您在onDataChange中进行插入时,该方法将在其他时间自行调用它们,而无需调用它们

Boolean fetched = false;

ValueEventListener listener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        if (fetched == false) {
            fetched = true;
            List<Item> items = utils.convertChildrenToList(dataSnapshot, Item.class);
            getView().setData(customContexts);
            getView().showContent();
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        getView().showError(databaseError.toException(), true);

    }
};


Query query = database.getReference("/ashWoYViS3SbHtBhLpvStRleBl13/items")
        .orderByKey();

fetched=false;
query.addValueEventListener(listener);
Boolean fetched=false;
ValueEventListener=新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
if(fetched==false){
fetched=true;
List items=utils.convertChildrenToList(dataSnapshot,Item.class);
getView().setData(自定义上下文);
getView().showContent();
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
getView().batherRor(databaseError.toException(),true);
}
};
Query Query=database.getReference(“/ashwoyvis3sbhtbhlpvstrebl13/items”)
.orderByKey();
取数=假;
query.addValueEventListener(listener);

听起来很奇怪。有没有可能?我尝试了使用和不使用磁盘持久性,结果相同:(我能想象这种情况发生的唯一方式是,如果你的磁盘缓存与服务器端值不同步,你会得到一个又一个。请尝试完全删除应用程序,然后在停止使用磁盘缓存后重新安装。这会给你一个新的开始状态(iirc)。我试图从Firebase中删除该应用,并创建了一个新应用。同样的情况…:(您可能正在使用新创建的侦听器对象多次调用addValueEventListener方法。请确保不要多次调用addValueEventListener。