首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果我通过updateChildren()方法将多个10+项目更新到firebase,我的应用程序UI将被冻结或不响应

如果我通过updateChildren()方法将多个10+项目更新到firebase,我的应用程序UI将被冻结或不响应
EN

Stack Overflow用户
提问于 2020-07-19 19:25:38
回答 1查看 40关注 0票数 0
代码语言:javascript
代码运行次数:0
运行
复制
{
  RootRef.child("LatestMessages").child(messageReceiverID).child(messageSenderID).addValueEventListener(new ValueEventListener()
        {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot)
            {
                if (dataSnapshot.exists()) {
                    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                        Messages messages = snapshot.getValue(Messages.class);

                        if (messages.getFrom() != null) {
                            if (messages.getFrom().equals(messageReceiverID) && !messages.isIsseen()) {

                                HashMap<String, Object> hashMap = new HashMap<>();

                                hashMap.put("isseen", true);
                                snapshot.getRef().updateChildren(hashMap);
                                seenChatList();
                            }
                        }
                        else
                        {

                        }
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

    }

如果我通过updateChildren()方法将多个10+项更新到firebase,我的应用程序UI就会冻结或变得没有响应。

当有人看到一条消息时,我需要将Firebase上的每一条消息都标记为true。请不要建议只标记最后一条消息,因为如果我这样做了,那么在聊天列表活动中,我将无法获得会话中所有不可怕的消息的计数。

其概念类似于WhatsApp。在聊天列表中,我想要显示所有未读消息计数,以及当我打开chatbox时,对于每条收到的消息,它应该标记为firebase的“已见”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-19 23:19:32

Firebase的任何网络和磁盘I/O都发生在主线程之外,因此导致UI冻结的可能性很小。您可能希望在代码中更多地解决代码的哪一部分导致UI冻结的问题。

也就是说,如果您想要减少对Firebase的API调用数量,您可以执行单个多位置更新来实现相同的目的:

代码语言:javascript
代码运行次数:0
运行
复制
DatabaseReference ref = RootRef.child("LatestMessages").child(messageReceiverID).child(messageSenderID);
ref.addValueEventListener(new ValueEventListener(){
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            HashMap<String, Object> updates = new HashMap<>();

            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                Messages messages = snapshot.getValue(Messages.class);

                if (messages.getFrom() != null) {
                    if (messages.getFrom().equals(messageReceiverID) && !messages.isIsseen()) {
                        updates.put(snapshot.getKey() + "/isseen", true);
                        seenChatList();
                    }
                }
            }

            ref.updateChildren(updates);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // never ignore errors
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62979619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档