ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-09-25 19:33:10  阅读:231  来源: 互联网

标签:firebaseui android java firebase google-cloud-firestore


我已经使用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()方法中使用以下代码行:

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

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

@Override
protected 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);

标签:firebaseui,android,java,firebase,google-cloud-firestore
来源: https://codeday.me/bug/20190925/1816677.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有