{
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的“已见”。
发布于 2020-07-19 15:19:32
Firebase的任何网络和磁盘I/O都发生在主线程之外,因此导致UI冻结的可能性很小。您可能希望在代码中更多地解决代码的哪一部分导致UI冻结的问题。
也就是说,如果您想要减少对Firebase的API调用数量,您可以执行单个多位置更新来实现相同的目的:
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
}
});
https://stackoverflow.com/questions/62979619
复制相似问题