【问题标题】:onDataChange is getting called more than once when offline is enabled in firebase在 Firebase 中启用离线时,onDataChange 被多次调用
【发布时间】:2020-05-06 22:23:08
【问题描述】:

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

我正在使用 firebase 实时数据库开发 Android 应用程序。 我已开启离线持久性。

我正在使用 onDataChange 方法创建一个新的 ValueEventListener 对象,如下所示:

changeListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
...}};
dbRef.addValueEventListener(changeListener);

通过应用程序中的另一个片段,我从 dbRef 指向的位置删除了一个元素。假设最初我在 dbRef 中有十个元素。如果我在 onDataChange 代码中设置一个断点,我会看到它连续调用了 3 次。第一次,dataSnapShot 有九个元素。第二次,它有十个元素(包括刚刚删除的那个),最后第三次,它又是九个元素。

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

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

我的问题是:

  1. 这是预期行为吗?
  2. 如果是这样,为什么会这样?
  3. 有没有办法避免对 onDataChange 的三个调用?

提前非常感谢

【问题讨论】:

  • 你试过用 singleValueEventListener 代替 valueEventListener 吗?

标签: android firebase firebase-realtime-database


【解决方案1】:

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

在我删除 dbRef 中的元素的片段中,我没有删除元素并立即返回到该片段(包含 valueEventlistener),而是添加了一个成功侦听器,如下所示:

dbRef.removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                    getFragmentManager().popBackStackImmediate();
                                }
                            }).addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception exception) {

                                }
                            });

现在,onDataChange 只被调用一次。仔细想想,这很有意义。您不想从数据库中删除项目并立即处理数据。相反,您希望等到确保删除生效后,再进行进一步处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2017-04-08
    • 2017-06-16
    相关资源
    最近更新 更多