这是我在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中被调用两次?
答案 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)
在两种情况下可能会发生这种情况:
onDataChange
被调用两次。
onDataChange
被多次调用,以防您没有正确删除侦听器,并且每次打开它都会在您的活动中创建新的侦听器实例。
方案2易于修复。您可以维护Firebase参考和侦听器的本地参考,而不是在“活动”的ref.removeListener(listener)
中进行onDestroy
的维护。方案2很难解决,您有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");