Java Firebase onDataChanged调用了很多次(没有更新),有时调用空值
我的firebase应用程序中有以下json树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
--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。