我遇到有关 Firebase Realtime数据库的问题,尤其是触发多次事件的value事件监听器。似乎当Internet状态多次从开到关更改时,设备最终具有稳定的连接,使用空内容的dataSnapshot调用侦听器的onstrongChange(DataSnapshot dataSnapshot)回调方法。似乎实时数据库引用了应用的本地缓存,并且在这种情况下,我没有任何数据存储。我将侦听器附加到Activity onStart()内,或者在设备建立了某些连接后;我在Activity onStop()方法内部或在设备断开Internet连接时分离侦听器。一次仅存在一个给定侦听器的实例,并且每个附加操作都在需要时执行相应的分离操作。我尝试在连接状态更改之间等待一会儿,然后再连接侦听器,如果datasnapshot返回null,则重新连接侦听器。这些都不起作用。请提出解决方案。
Activity中的一些示例代码:
private ValueEventListener listener;
private Query query;
private boolean hasAttachedListener;
private Query getDatabaseReference() {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
return reference.child(“some child ref”)
.child(“other child ref 2 ”);
}
private ValueEventListener getDatabaseListener() {
return new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(“firebase”, dataSnapshot.toString());
//issue here datasnapshot is null sometimes
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(“firebase”, databaseError.getDetails());
}
};
}
/**
* Attaches listener
*/
public void addListener() {
if (!hasAttachedListener) {
query = getDatabaseReference();
listener = getDatabaseListener();
query.addValueEventListener(listener);
hasAttachedListener = true;
}
}
/**
* Detaches the attached listener
*/
public void removeListener() {
if (hasAttachedListener) {
query.removeEventListener(listener);
query = null;
listener = null;
hasAttachedListener = false;
}
}
@Override
protected void onStart() {
super.onStart();
addListener();
}
@Override
protected void onStop() {
super.onStop();
removeListener();
}
@Override
protected void onNetworkDisconnected() {
super.onNetworkDisconnected();
// invoked when internet connection is lost
removeListener();
}
@Override
protected void onNetworkReconnected() {
super.onNetworkReconnected();
// invoked when internet connection is restored
addListener();
}
答案 0 :(得分:0)
具有firebase脱机功能,如果没有与数据库的连接,则不需要使用这两种方法进行监听
因此您的onNetworkDisconnected
和onNetworkReconnected
不是必需的
在此处检查Firebase文档:https://firebase.google.com/docs/database/android/offline-capabilities
Firebase实时数据库为活动的侦听器同步并存储数据的本地副本。此外,您可以使特定位置保持同步。
DatabaseReference scoresRef = FirebaseDatabase.getInstance().getReference("scores");
scoresRef.keepSynced(true);
即使引用没有活动的侦听器,Firebase Realtime Database客户端也会自动在这些位置下载数据并保持同步。您可以使用下面的代码关闭同步。
答案 1 :(得分:0)
新数据应具有唯一名称,以防止替换现有