gpt4 book ai didi

android - 为什么 onChildAdded 会被多次触发?

转载 作者:行者123 更新时间:2023-11-30 00:03:45 26 4
gpt4 key购买 nike

我的代码有问题,不知道是不是因为onChildAdded或者RecyclerView才搞定的

简单地我想在 RecyclerView 上显示消息收件箱,其中包含我从其他用户收到的所有消息,每条消息都包含最后发送的消息和有关发件人的信息,例如他的姓名和照片。

像这样

这是我的结构

Messages
Receiver_UID
Sender_UID
push
message : "text"

我使用了 2 个嵌套查询来实现所以首先我得到发件人 UID,然后我从另一个查询中得到最后一条消息

dataQuery = FirebaseDatabase.getInstance().getReference("Messages").child(my_Id);
dataQuery.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot getalldata, String s) {

final String sender_UID = getalldata.getKey();

Query lastmess = FirebaseDatabase.getInstance().getReference("Messages").child(my_Id).child(sendUID);
lastmess.orderByKey().limitToLast(1).addChildEventListener(new ChildEventListener() { // last message
@Override
public void onChildAdded(DataSnapshot snap, String s) {
MessModel messages = snap.getValue(MessModel.class);
String Last_message = messages.getMessage();
getUserData(Last_message ,sender_UID);

}

@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {

}

@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {

}

@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {

}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});
}

@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {

}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {


}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {

}
@Override
public void onCancelled(DatabaseError databaseError) {

}
});

最后我通过这种方法得到了发件人的信息

private void getUserData(final String last_message , String sendUID) {
FirebaseDatabase.getInstance().getReference("Users").orderByKey().equalTo(sendUID).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(final DataSnapshot data, final String s) {

listImessagesitem model = data.getValue(listImessagesitem.class);
name =model.getName();
uid = model.getUid();
//another information

result.add( new listImessagesitem( name ,last_message ,uid, ... another info));
useradapter = new listMessagesAdapter(getActivity(),result);
myList.setAdapter(useradapter);
useradapter.notifyDataSetChanged();

}

@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {

}

@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {

}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}

@Override
public void onCancelled(DatabaseError databaseError) {
}

});
}

它第一次运行良好,当我进行刷新时也是如此

问题是有人在收件箱的消息列表中向我发送了一条新消息。在这种情况下,如果我没有进行刷新,我会看到两个发件人具有相同的信息和不同的最后一条消息......如果他再次发送,我会看到 3 个发件人具有相同的前一个案例等等。

我该如何解决?

我的意思是,如果他已经存在于我的收件箱列表中,我该如何向他添加新消息

任何帮助将不胜感激,谢谢

最佳答案

通过查看您的代码,我了解到您嵌套了 ChildEventListener。因此,每次调用顶级监听器时,都会创建一个新的内部子监听器,因为它会调用 getUserData 方法来更新适配器,从而导致重复数据。

你能做什么?

1:检查结果列表是否包含该对象,如果不包含则添加,否则忽略。

2:据我了解,我相信您正在尝试创建一个邮件客户端应用程序,两个用户可以在其中相互发送电子邮件。因此,为什么不为这两个用户创建一个像这样的 user_1_ID+user_2_ID 的单个节点,而不是数据库中的结构。

这降低了复杂性,因为两个用户将从同一个节点读取消息对象应该有一个时间戳字段来确定最新的消息。

关于android - 为什么 onChildAdded 会被多次触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49420696/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com