如何使用这两个函数在 Firebase 上监听数据- Android
How using both functions to listen data on Firebase- Android
我在 Firebase 上的数据是这样的:
"node": {
"node1": {
"value1": value,
"value2": value,
"subSubNode":{
//....values....//
},
},
"node2": { ... },
"node3": { ... }
//...and so on ..//
}
首先: 我想从 Firebase 获取所有数据并渲染到我的树,所以我使用了 addListenerForSingleValueEvent() 函数。
然后: 我使用 addChildEventListener() 函数来监听节点或子节点何时更改、删除或添加...
private void getData(Query ref){
ref.addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
**I render data on my tree here**
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.i(TAG, "onChildAdded");
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
Log.i(TAG, "onChildChanged");
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.i(TAG, "onChildRemoved");
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
Log.i(TAG, "onChildMoved");
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.i(TAG, "onCancelled");
}
});
}
但是 onChildAdded() 方法在 addChildEventListener() 函数中总是 运行 首先。对我有什么想法或解决方案吗?我在那个位置正确使用 addChildEventListener() 函数吗?
ChildEventListener
中的方法对初始数据 和 对数据的后续更改都触发。
调用 addChildEventListener()
后,每个现有子节点都会调用 onChildAdded()
。您可以使用这些事件来构建初始树。添加初始数据后,随着数据的变化,您将收到对所有 onChild...
方法的调用。
所以不要注册 addListenerForSingleValueEvent()
并简单地从 ChildEventListener
的方法构建树。
或者如果你想单独处理初始数据,你可以使用event guarantees that Firebase has:
之一
Value events are always triggered last and are guaranteed to contain updates from any other events which occurred before that snapshot was taken.
boolean isInitialValueLoaded = false;
ref.addListenerForSingleValueEvent(new ValueEventListener(){
public void onDataChange(DataSnapshot dataSnapshot) {
**I render data on my tree here**
isInitialValueLoaded = true;
}
public void onCancelled(FirebaseError firebaseError) {
}
});
ref.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if (!isInitialValueLoaded) return;
Log.i(TAG, "onChildAdded");
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
if (!isInitialValueLoaded) return;
Log.i(TAG, "onChildChanged");
}
public void onChildRemoved(DataSnapshot dataSnapshot) {
if (!isInitialValueLoaded) return;
Log.i(TAG, "onChildRemoved");
}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
if (!isInitialValueLoaded) return;
Log.i(TAG, "onChildMoved");
}
public void onCancelled(FirebaseError firebaseError) {
Log.i(TAG, "onCancelled");
}
});
我在 Firebase 上的数据是这样的:
"node": {
"node1": {
"value1": value,
"value2": value,
"subSubNode":{
//....values....//
},
},
"node2": { ... },
"node3": { ... }
//...and so on ..//
}
首先: 我想从 Firebase 获取所有数据并渲染到我的树,所以我使用了 addListenerForSingleValueEvent() 函数。
然后: 我使用 addChildEventListener() 函数来监听节点或子节点何时更改、删除或添加...
private void getData(Query ref){
ref.addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
**I render data on my tree here**
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.i(TAG, "onChildAdded");
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
Log.i(TAG, "onChildChanged");
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.i(TAG, "onChildRemoved");
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
Log.i(TAG, "onChildMoved");
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.i(TAG, "onCancelled");
}
});
}
但是 onChildAdded() 方法在 addChildEventListener() 函数中总是 运行 首先。对我有什么想法或解决方案吗?我在那个位置正确使用 addChildEventListener() 函数吗?
ChildEventListener
中的方法对初始数据 和 对数据的后续更改都触发。
调用 addChildEventListener()
后,每个现有子节点都会调用 onChildAdded()
。您可以使用这些事件来构建初始树。添加初始数据后,随着数据的变化,您将收到对所有 onChild...
方法的调用。
所以不要注册 addListenerForSingleValueEvent()
并简单地从 ChildEventListener
的方法构建树。
或者如果你想单独处理初始数据,你可以使用event guarantees that Firebase has:
之一Value events are always triggered last and are guaranteed to contain updates from any other events which occurred before that snapshot was taken.
boolean isInitialValueLoaded = false;
ref.addListenerForSingleValueEvent(new ValueEventListener(){
public void onDataChange(DataSnapshot dataSnapshot) {
**I render data on my tree here**
isInitialValueLoaded = true;
}
public void onCancelled(FirebaseError firebaseError) {
}
});
ref.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if (!isInitialValueLoaded) return;
Log.i(TAG, "onChildAdded");
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
if (!isInitialValueLoaded) return;
Log.i(TAG, "onChildChanged");
}
public void onChildRemoved(DataSnapshot dataSnapshot) {
if (!isInitialValueLoaded) return;
Log.i(TAG, "onChildRemoved");
}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
if (!isInitialValueLoaded) return;
Log.i(TAG, "onChildMoved");
}
public void onCancelled(FirebaseError firebaseError) {
Log.i(TAG, "onCancelled");
}
});