如何使用这两个函数在Firebase上监听数据 - Android

时间:2015-11-27 11:54:04

标签: android firebase firebase-realtime-database

我在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()函数是否正确?

1 个答案:

答案 0 :(得分:3)

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