【问题标题】:How using both functions to listen data on Firebase- Android如何使用这两个函数在 Firebase-Android 上监听数据
【发布时间】:2015-11-27 11:54:03
【问题描述】:

我在 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");
        }
    });
}

addChildEventListener() 函数中的 onChildAdded() 方法总是先运行。对我有什么想法或解决方案吗?我在那个位置使用 addChildEventListener() 函数是否正确?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    ChildEventListener 中的方法会触发初始数据以触发对该数据的后续更改。

    调用addChildEventListener() 后,每个现有子节点都会调用onChildAdded()。您可以使用这些事件来构建初始树。添加初始数据后,随着数据的变化,您将收到对所有onChild... 方法的调用。

    所以不要注册addListenerForSingleValueEvent(),而只需使用ChildEventListener 的方法构建树。

    或者如果你想单独处理初始数据,你可以使用event guarantees that Firebase has之一:

    值事件总是最后触发,并保证包含在拍摄快照之前发生的任何其他事件的更新。

    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");
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 2019-05-20
      • 2021-10-21
      • 2016-05-08
      相关资源
      最近更新 更多