java– 如何设置addSnapshotListener并在RecyclerView项中的populateViewHolder中删除?

java– 如何设置addSnapshotListener并在RecyclerView项中的populateViewHolder中删除?,第1张

概述我已经使用FirebaseUI-Android库实现了RecyclerView.一旦我使用FirebaseRecyclerAdapter,我的RecyclerView实时数据就会发生变化在Collection中,数据文档的字段类型为Boolean,Integer,Reference.我想使用Reference来使用addSnapshotListener在populateViewHolder中获取数据.

我已经使用firebaseui-Android库实现了RecyclerVIEw.

一旦我使用FirebaseRecyclerAdapter,我的RecyclerVIEw实时数据就会发生变化

在Collection中,数据文档的字段类型为Boolean , Integer, Reference.

我想使用Reference来使用addSnapshotListener在populateVIEwHolder中获取数据.

帮我!这是我的代码:

         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,则必须在不需要Detach a listener时将其删除

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>像这样:

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侦听器注册;变量并在需要的地方添加SnapshotListener,如下所示:

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

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

@OverrIDeprotected voID onStop() {    if (ListenerRegistration != null) {        ListenerRegistration.remove();    }}

另外,一旦调用onStart()方法,请不要忘记再次添加它.

@OverrIDeprotected voID onStart() {    super.onStart();    ListenerRegistration = yourRef.addSnapshotListener(eventListener);}

当您为listening to realtime updates调用addSnapshotListener时,这意味着您附加了一个侦听器,该侦听器将针对数据库中发生的每个更改进行调用.所以当你的应用程序关闭时也会发生这种情况,这就是为什么在活动被销毁之前它必须到detach the listeners.

如果在您的应用程序中您不需要实时获取数据,那么您可以直接在引用上使用get()调用,该引用只读取文档一次.因为它只读取一次,所以没有被删除的监听器.这是Firebase实时数据库中使用的addListenerForSingleValueEvent()的对应方.

还有一种更优雅的方法可以删除侦听器,即将该活动作为addSnapshotListener()方法中的参数传递,因此Firestore可以在活动停止时自动清理侦听器.

ListenerRegistration lg = yourdocumentRef            .addSnapshotListener(YourActivity.this, eventListener);
总结

以上是内存溢出为你收集整理的java – 如何设置addSnapshotListener并在RecyclerView项中的populateViewHolder中删除?全部内容,希望文章能够帮你解决java – 如何设置addSnapshotListener并在RecyclerView项中的populateViewHolder中删除?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1102748.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存