当前位置: 首页 > 面试题库 >

如何在Android的Firebase中跟踪侦听器?

羊舌承颜
2023-03-14
问题内容

我有一个位置上给定用户的聊天室列表,而另一个位置上有给定聊天室的消息总数。我想跟踪用户所属聊天室中的一些消息。

我有以下片段:

//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) {

                }
            });
        }
    }

    //......
}

问题是,稍后将调用onChildRemoved时,如何删除所有那些ValueEventListener呢?还是不再需要它们了?

建议的处理这种情况的方法是什么?我应该将子键和侦听器存储在HashMap中并自己进行跟踪,还是可以通过某种方法删除给定Firebase位置的所有侦听器?


问题答案:

出于数据考虑,一种方法是先创建一个HashMapValueEventListeners然后在中创建,onStop否则onDestroy您将删除这些侦听器。

为了简单起见,您应该使用单个事件侦听器获取会议室。然后,您可以为每个房间创建一个实时侦听器。

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应用程序中,我有一个活动,它有3或4个片段,可以根据一些用户或服务器事件按顺序附加。 我想在firebase中将所有这些片段作为屏幕进行跟踪。 因此,理想情况下,如果可能的话,是否有一个API我可以在片段的onCreate中调用,并告诉firebase用户当前处于fraction1,fragment2或fracment3中?

  • (我想一个选择是重新修改我们的Feign接口,使其具有@feignclient,并重新修改所有自定义拦截器、编码器等的应用方式,但最终这可能是一项很大的工作,风险也很大。) 我是否需要做一个特殊的请求拦截器来手动地注入这些(例如,从一个自动连线的跟踪器)?有没有一种干净的方法(或现有的类)来做到这一点?

  • 我有两个非常简单的spring-cloud-stream应用程序。消息生产者Service3通过Binder-Kafka向消费者Service4发送消息。 我用春云侦探来追踪它们之间的跨度。但是只有Service3中的跨在zipkin服务器中可用。Service4没有显示span。

  • 我看到最后一个android sdk中有一个更新,他们显示,他们记录了每个事件的参数,但是我如何添加屏幕跟踪? 仪表板中有一个用户参与度选项卡,但该选项卡不会展开以提供更多见解。 但是,我在切换活动时看到这样的消息: D/FA:记录事件(FE):_e,束[{_o=auto,_et=4807,_sc=MainActivity,_si=-3289793799694080660}] 这是什么意思?他们在

  • 我正在使用侦探2.0.x,我想添加我自己的跟踪ID,除了它自己的。 我正在浏览给定的链接 https://cloud.spring.io/spring-cloud-static/spring-cloud-sleuth/2.0.0.RC2/single/spring-cloud-sleuth.html#_propagation 我想修改跟踪如下代码:-公共静态最终字符串TAG _ NAME = "