如何在Android上跟踪Firebase中的听众? [英] How to keep track of listeners in Firebase on Android?

查看:150
本文介绍了如何在Android上跟踪Firebase中的听众?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个给定用户在一个位置的聊天室列表,以及另一个位置给定聊天室的消息总数。



我有以下代码片段:




我有一个用户属于聊天室的消息。 pre> //获取这个用户所有的聊天室属于
mFirebase.child(myChatRooms)。child(testUser)。addChildEventListener(new ChildEventListener(){$ b (DataSnapshot postSnapshot:dataSnapshot.getChildren()){
ChatRoom myRoom = postSnapshot.getValue(ChatRoom.class)$ b $ public void onChildAdded(DataSnapshot dataSnapshot,String previousKey){
;

//监听每个聊天室的消息数用户属于
mFirebase.child(chatRoomMessageCount)。child(postSnapshot.getKey())。addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot){
//消息数已经改变
}

@Override
public void onCancelled(FirebaseError firebaseError){


});
}
}

// ......
}

现在的问题是,如何在调用onChildRemoved的时候删除所有这些ValueEventListener,否则我将不再需要它们了。



处理这种情况的建议方法是什么?我应该在HashMap中存储子键和侦听器,并自己跟踪它们,还是有一些方法可以删除给定的Firebase位置的所有侦听器? 解决方案数据认真的方式是创建一个 HashMap ValueEventListeners ,然后在 onStop onDestroy 您可以删除这些侦听器。



,你应该使用单个事件监听器来获取房间。然后为每个房间创建一个实时监听器。

  public class MainActivity extends Activity {

private Firebase mRef;
私有HashMap< Firebase,ValueEventListener> mListenerMap;

@Override
protected void onStart(){
super.onStart();

mRef = new Firebase(https://< your-firebase-app> / myChatRooms / testUser); (DataSnapshot postSnapshot:dataSnapshot.getChildren())

mRef.addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot){
{

ValueEventListener listener = new ValueEventListener(){
@Override $ b $ public void onDataChange(DataSnapshot dataSnapshot){
//在这里做你的事
}
$ b @Override
public void onCancelled(FirebaseError firebaseError){

$ b $;
mListenerMap.put(postSnapshot.getRef() ,listener);
Firebase childRef = mRef.child(chatRoomMessageCount)。child(postSnapshot.getKey());
childRef.addValueEventListener(list ENER);


$ b @Override
public void onCancelled(FirebaseError firebaseError){


});


@Override
protected void onStop(){
super.onStop(); (Map.Entry< Firebase,ValueEventListener>条目:mListenerMap.entrySet()){
Firebase ref = entry.getKey();
ValueEventListener listener = entry.getValue();
ref.removeEventListener(listener);
}
}
}


I have a list of chat rooms for a given user at one location, and total number of messages for a given chat room at another location. I want to keep track of a number of messages at chatrooms user belongs to.

I have a following snippet:

//getting all chat rooms this user belongs to
mFirebase.child("myChatRooms").child("testUser").addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded (DataSnapshot dataSnapshot, String previousKey){
        for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
            ChatRoom myRoom = postSnapshot.getValue(ChatRoom.class);

            //listening to  message count in every chat room user belongs to
            mFirebase.child("chatRoomMessageCount").child(postSnapshot.getKey()).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                        //number of messages have changed
                }

                @Override
                public void onCancelled(FirebaseError firebaseError) {

                }
            });
        }
    }

    //......
}

The question is, how do I remove all those ValueEventListener's later, when onChildRemoved will be called, or I won't need them anymore?

What is the recommended approach in dealing with this situation? Should I store child key and listener in HashMap and keep track of them myself or there is some way to remove all listeners for a given firebase location?

解决方案

A data conscientious way would be to create a HashMap of ValueEventListeners and then in onStop or onDestroy you would remove those listeners.

To keep things simple, you should use a single event listener to get the rooms. Then for each room you can create a realtime listener.

public class MainActivity extends Activity {

    private Firebase mRef;
    private HashMap<Firebase, ValueEventListener> mListenerMap;

    @Override
    protected void onStart() {
        super.onStart();

        mRef = new Firebase("https://<your-firebase-app>/myChatRooms/testUser");

        mRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {

                    ValueEventListener listener = new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            // do your thing here
                        }

                        @Override
                        public void onCancelled(FirebaseError firebaseError) {

                        }
                    };
                    mListenerMap.put(postSnapshot.getRef(), listener);
                    Firebase childRef = mRef.child("chatRoomMessageCount").child(postSnapshot.getKey());
                    childRef.addValueEventListener(listener);
                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });
    }

    @Override
    protected void onStop() {
        super.onStop();
        for (Map.Entry<Firebase, ValueEventListener> entry : mListenerMap.entrySet()) {
            Firebase ref = entry.getKey();
            ValueEventListener listener = entry.getValue();
            ref.removeEventListener(listener);
        }
    }
}

这篇关于如何在Android上跟踪Firebase中的听众?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆