android - onDataChange 在 android Firebase 中被调用两次

标签 android firebase firebase-realtime-database

这是我在 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 中被调用两次?

最佳答案

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

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

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

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

  1. 如果您始终需要更新的最新值,请禁用离线持久性。
  2. 执行 runnable.postDelayed(callbackRunnable, 3000); 以等待最新值 3 秒,然后再更新 View 或您想要更新的任何内容。

关于android - onDataChange 在 android Firebase 中被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39304670/

相关文章:

swift - 从推送通知中获取值

ios - 应用程序到达前台后呈现模式的最佳方法

android - 获取 Firebase 数据库 Android 中的最后一个节点

java - 如何从 android 中的 firebase 数据库中的 uid 获取/检索多个数据?

android - FileProvider 和二级外部存储

Android:在相机预览上绘制图像

android - 设置正确的方向以预览相机和最终结果图像

java - 过滤器将 ArrayList<object> 添加到 HashMap

arrays - 如何正确地将 Firebase 中的数据添加到数组中?

javascript - Firebase ServerValue.increment(1) 不适用于云函数