【问题标题】:onDataChange is getting called twice in android FirebaseonDataChange 在 android Firebase 中被调用两次
【发布时间】:2016-09-03 08:02:27
【问题描述】:

这是我在 android 应用中使用时间戳对 firebase 数据的简单查询

Query recentStaticJobQuery = reference.child(AppConstants.WORKINDIA_JOBS)
                        .child(AppConstants.WORKINDIA_STATIC_JOBS)
                        .orderByChild(AppConstants.TIMESTAMP)
                        .startAt(lastStaticJobSyncTime); 
recentStaticJobQuery.addListenerForSingleValueEvent
(staticJobDownloadListener);


 ValueEventListener staticJobDownloadListener = new ValueEventListener() {
    @Override
    public void onDataChange(final DataSnapshot dataSnapshot) {
        Log.i("Firebase", "Called")
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.i("Firebase", "onCancelled")
    }
};

如何避免 onDataChange 在 android Firebase 中被调用两次?

【问题讨论】:

  • recentStaticJobQuery.addListenerForSingleValueEvent (staticJobDownloadListener); 是否被调用了两次?
  • 没有。我首先测试过的
  • 如果您看到单值事件侦听器的 onDataChange() 被调用两次,请确保您没有在两个地方附加侦听器。
  • 嗨!您可以在附加和分离侦听器的位置显示您的活动的整个代码吗?也许,您也在 auth 事件中附加 onResume 和 Firebase Auth?
  • @Slava 对不起,我现在删除了 firebase,但我正在使用 recentStaticJobQuery.addListenerForSingleValueEvent (staticJobDownloadListener);所以它应该只被调用一次

标签: android firebase firebase-realtime-database


【解决方案1】:

有两种情况可能会发生这种情况:

  1. onDataChange 被调用两次,以防您启用了离线持久性。一次使用过时的离线值,再次使用更新后的值,以防它发生变化。

  2. onDataChange 会被多次调用,以防您没有正确删除侦听器,并且每次打开它时都会在您的 Activity 中创建一个新的侦听器实例。

场景 2 很容易修复。您可以维护您的 firebase 引用和侦听器的本地引用,而不是您可以在 Activity 的 onDestroy 中执行 ref.removeListener(listener)。场景 2 难以解决,您有 2 种可能的补救措施:

  1. 禁用离线持久化,以防您总是想要更新的最新值。
  2. 执行runnable.postDelayed(callbackRunnable, 3000); 以等待最新值 3 秒,然后再更新视图或您要更新的任何内容。

【讨论】:

    【解决方案2】:

    像这样使用 SingleEventListener 而不是 ValueEventListener

    Firebase ref = new Firebase("YOUR-URL-HERE/PATH/TO/YOUR/STUFF");
    ref.addListenerForSingleValueEvent(new ValueEventListener() {
       @Override
       public void onDataChange(DataSnapshot dataSnapshot) {
           String value = (String) dataSnapshot.getValue();
           // do your stuff here with value
       }
       @Override
       public void onCancelled(FirebaseError firebaseError) {
       }
    });
    

    【讨论】:

      【解决方案3】:

      通过添加endAt() 替换您的查询,如下所示。它会帮助你。

      Query recentStaticJobQuery = reference.child(AppConstants.WORKINDIA_JOBS)
                              .child(AppConstants.WORKINDIA_STATIC_JOBS)
                              .orderByChild(AppConstants.TIMESTAMP)
                              .startAt(lastStaticJobSyncTime).endAt(lastStaticJobSyncTime+"\uf8ff"); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 2020-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-14
        相关资源
        最近更新 更多