Android 在firebase中启用脱机时,onDataChange会被多次调用

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)

我已经为此挣扎了半天多,最终想在这里提出我的问题

我正在使用firebase实时数据库开发一个Android应用程序我已打开脱机Persistance。

我正在使用onDataChange方法创建一个新的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指向的位置删除了一个元素。让我们假设最初我在dbRef中有十个元素。如果我在onDataChange代码中放置一个断点,我会看到它会被连续调用三次。第一次,dataSnapShot包含九个元素。第二次,它有十个元素(包括刚刚删除的元素),最后第三次,它又有九个元素

请注意,如果关闭脱机持久性,则不会发生此问题。如果我手动从数据库领事中删除元素,这两种情况都不会发生。在这两种情况下,onDataChange只调用一次

我还在片段中正确地添加了onResume中的侦听器方法,并在onPause中删除它

我的问题是:

  • 这是预期的行为吗
  • 如果是,为什么会发生这种情况
  • 有没有办法避免三次调用onDataChange

  • 提前多谢了

    我找到了解决这个问题的好办法

    在我删除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?