onDataChange在android Firebase中被调用两次

时间:2016-09-03 08:02:27

标签: 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中被调用两次?

3 个答案:

答案 0 :(得分:3)

使用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) {
   }
});

答案 1 :(得分:3)

在两种情况下可能会发生这种情况:

    如果您启用了脱机持久性,则
  1. onDataChange被调用两次。

  2. 一次使用陈旧的脱机值,然后一次使用更新后的值。

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

方案2易于修复。您可以维护Firebase参考和侦听器的本地参考,而不是在“活动”的ref.removeListener(listener)中进行onDestroy的维护。方案2很难解决,您有2种可能的解决方法:

  1. 如果始终需要更新的最新值,请禁用离线持久性。
  2. 在更新视图或您要更新的任何内容之前,请执行runnable.postDelayed(callbackRunnable, 3000);等待最新值3秒钟。

答案 2 :(得分:0)

通过添加endAt()来替换查询,如下所示。它将为您提供帮助。

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