如何设置addSnapshotListener并在RecyclerView Item中的populateViewHolder中删除? [英] How to set addSnapshotListener and remove in populateViewHolder in RecyclerView Item?

查看:190
本文介绍了如何设置addSnapshotListener并在RecyclerView Item中的populateViewHolder中删除?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经使用 FirebaseUI-Android库 实现了RecyclerView.

我使用 FirebaseRecyclerAdapter

My RecyclerView realtime data change well once i use that FirebaseRecyclerAdapter

在集合中,该数据文档的字段类型为布尔值,整数,引用.

In Collection that data document have field type as Boolean , Integer, Reference.

希望使用该引用通过addSnapshotListener populateViewHolder中获取数据.

救救我!这是我的代码:

Help me! Here is my code:

         FirebaseRecyclerAdapter<Conv, ConvViewHolder> firebaseConvAdapter = new FirebaseRecyclerAdapter<Conv, ConvViewHolder>(
            Conv.class,
            R.layout.users_single_layout,
            ConvViewHolder.class,
            conversationQuery
    ) {
        @Override
        protected void populateViewHolder(final ConvViewHolder convViewHolder, final Conv conv, int i) {

            final String list_user_id = getRef(i).getKey();

            final DocumentReference docRef = db.collection("cities").document(list_user_id);
            docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
                @Override
                public void onEvent(@Nullable DocumentSnapshot snapshot,
                                    @Nullable FirebaseFirestoreException e) {
                    if (e != null) {
                        Log.w(TAG, "Listen failed.", e);
                        return;
                    }

                    if (snapshot != null && snapshot.exists()) {
                        Log.d(TAG, "Current data: " + snapshot.getData());
                    } else {
                        Log.d(TAG, "Current data: null");
                    }
                }
            });
        }
    };

    mConvList.setAdapter(firebaseConvAdapter);

Firebase说,如果您添加addSnapshotListener,则必须将其删除一次,无需该分离听众

Firebase saying if you add addSnapshotListener then must to remove it once no need for that Detach a listener

当您不再对侦听数据感兴趣时,必须分离侦听器,以使事件回调不再被调用.这允许客户端停止使用带宽来接收更新.您可以使用onSnapshot()上的取消订阅功能停止收听更新.

When you are no longer interested in listening to your data, you must detach your listener so that your event callbacks stop getting called. This allows the client to stop using bandwidth to receive updates. You can use the unsubscribe function on onSnapshot() to stop listening to updates.

推荐答案

要实现此目的,您需要使用如下的EventListener<DocumentSnapshot>:

To achieve this, you need to use a EventListener<DocumentSnapshot> like this:

EventListener<DocumentSnapshot> eventListener = new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(DocumentSnapshot snapshot, FirebaseFirestoreException e) {
        if (snapshot != null && snapshot.exists()) {
            //Do what you need to do
        }
    }
};

声明一个全局ListenerRegistration listenerRegistration;变量,并在需要的地方添加SnapshotListener,如下所示:

Declare a global ListenerRegistration listenerRegistration; variable and add the SnapshotListener in the place where is needed like this:

if (listenerRegistration == null ) {
    listenerRegistration = yourRef.addSnapshotListener(eventListener);
}

要删除侦听器,只需在onStop()方法中使用以下代码行:

To remove the listener, just use the following lines of code, in your onStop() method:

@Override
protected void onStop() {
    if (listenerRegistration != null) {
        listenerRegistration.remove();
    }
}

此外,一旦调用onStart()方法,别忘了再次添加它.

Also, don't forget to add it again once your onStart() method is called.

@Override
protected void onStart() {
    super.onStart();
    listenerRegistration = yourRef.addSnapshotListener(eventListener);
}

当您呼叫addSnapshotListener进行收听实时更新,这意味着您将附加一个侦听器,该侦听器将针对数据库中发生的每个更改而被调用.因此,当您关闭应用程序时也会发生这种情况,这就是为什么必须强制在活动被销毁之前,先将监听器分离.

When you are calling addSnapshotListener for listening to realtime updates, it means that you attach a listener that gets called for every change that takes place in your database. So this is happening also when your app is closed, that's why it's mandatory to detach the listeners before the activity gets destroyed.

如果您不需要在应用中实时获取数据,则只需使用

If in your app you don't need to get the data in realtime, then you can simply use a get() call directly on the reference, which just reads the document only once. Since it only reads once, there is no listener to be removed. This is the correspondent of addListenerForSingleValueEvent() used in the Firebase realtime database.

还有一种删除监听器的更优雅的方法,该方法就是将活动作为第一个参数传递给

There is also a more elegant way for removing the listener which is to pass the activity as first the argument in the addSnapshotListener() method, so Firestore can clean up the listeners automatically when the activity is stopped.

ListenerRegistration lg = yourDocumentRef
            .addSnapshotListener(YourActivity.this, eventListener);

这篇关于如何设置addSnapshotListener并在RecyclerView Item中的populateViewHolder中删除?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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