Android 在firebase中启用脱机时,onDataChange会被多次调用
我已经为此挣扎了半天多,最终想在这里提出我的问题 我正在使用firebase实时数据库开发一个Android应用程序我已打开脱机Persistance。 我正在使用onDataChange方法创建一个新的ValueEventListener对象,如下所示:Android 在firebase中启用脱机时,onDataChange会被多次调用,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我已经为此挣扎了半天多,最终想在这里提出我的问题 我正在使用firebase实时数据库开发一个Android应用程序我已打开脱机Persistance。 我正在使用onDataChange方法创建一个新的ValueEventListener对象,如下所示: changeListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot)
changeListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
...}};
dbRef.addValueEventListener(changeListener);
dbRef.removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
getFragmentManager().popBackStackImmediate();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
}
});
通过应用程序中的另一个片段,我从dbRef指向的位置删除了一个元素。让我们假设最初我在dbRef中有十个元素。如果我在onDataChange代码中放置一个断点,我会看到它会被连续调用三次。第一次,dataSnapShot包含九个元素。第二次,它有十个元素(包括刚刚删除的元素),最后第三次,它又有九个元素
请注意,如果关闭脱机持久性,则不会发生此问题。如果我手动从数据库领事中删除元素,这两种情况都不会发生。在这两种情况下,onDataChange只调用一次
我还在片段中正确地添加了onResume中的侦听器方法,并在onPause中删除它
我的问题是:
提前多谢了我找到了解决这个问题的好办法 在我删除dbRef中元素的片段中,我没有删除元素并立即返回到这个片段(包含valueEventlistener),而是添加了一个成功侦听器,如下所示:
changeListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
...}};
dbRef.addValueEventListener(changeListener);
dbRef.removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
getFragmentManager().popBackStackImmediate();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
}
});
dbRef.removeValue().addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公开作废(作废避免){
getFragmentManager();
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
}
});
现在,onDataChange只被调用一次。仔细想想,这很有道理。您不希望从数据库中删除项目并立即处理数据。相反,您希望等到确保删除生效后再进一步处理 您是否尝试了singleValueEventListener而不是valueEventListener?