如何使用这两个函数在 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");
    }
});