gpt4 book ai didi

java - DataSnapshot 无法创建自定义对象

转载 作者:行者123 更新时间:2023-12-01 16:19:35 25 4
gpt4 key购买 nike

我的问题是我试图让 messageAdapter 在 MessageActvity 的 recycleView 上显示数据库中的消息,这是执行此操作的方法代码(简而言之):

案例1

private void readMessages(final String myID, final String userID, final String imageURL) {
mChat = new ArrayList<>();

reference = FirebaseDatabase.getInstance().getReference("Chats");
reference.addValueEventListener(new ValueEventListener() {

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
mChat.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Chat chat = snapshot.getValue(Chat.class);

assert chat != null;
if ( chat.getSender().equals(myID) && chat.getReceiver().equals(userID) ||
chat.getSender().equals(userID) && chat.getReceiver().equals(myID)) {
mChat.add(chat) ;
}

messageAdapter = new MessageAdapter(MessageActivity.this, mChat, imageURL);
recyclerView.setAdapter(messageAdapter);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}

});
}

错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference

问题是,当像这样手动定义 Chat 聊天时,该方法运行得非常好:

案例2

Chat chat = new Chat(sender, receiver, "hi there");

它甚至显示消息“嗨,那里”X 次(X = 数据库中的消息数)。

我什至尝试做类似的事情来使用快照:

案例3

 String sender = snapshot.child("sender").getValue()).toString();
String receiver = snapshot.child("receiver").getValue()).toString();
String message = snapshot.child("message").getValue()).toString();
Chat chat = new Chat(sender,receiver,message);

但是,它仍然不起作用。结果总是崩溃(除了手动定义的情况-2,它可以工作)。

我尝试将 if 语句的条件更改为:

案例 4

if (chat.getSender() != null && chat.getReceiver() != null && chat.getSender().equals(myID) &&  chat.getReceiver().equals(userID) ||
chat.getSender() != null && chat.getReceiver() != null && chat.getSender().equals(userID) && chat.getReceiver().equals(myID)) {
mChat.add(chat) ;
}

这样做之后,应用程序不再是压垮的,因为 if 语句不起作用......我认为压垮应用程序的是

chat.getSender() == null && chat.getReceiver == null

当 if 语句开始检查条件时,它就会崩溃。

编辑更新:在尝试 log.v 后发现,从 datasnapshot 和 getter 方法返回的值是 null!这是代码

if (chat.getSender() == null){
Log.v("MessageActivity", "sender is null: " + chat.getSender());
}
if (chat.getReceiver() == null) {
Log.v("MessageActivity", "receiver is null: " + chat.getReceiver());
}

已更新

Log.v("MessageActivity", "snapshot: " +snapshot );
Log.v("MessageActivity", "chat variables: " + chat.getMessage() + ", " + chat.getReceiver() + ", " + chat.getSender() );
Log.v("MessageActivity", "mchat: " + mChat);

控制台:

2020-06-10 21:17:44.578 29735-29735/com.example.android.chattingapp V/MessageActivity: sender is null: null
2020-06-10 21:17:44.578 29735-29735/com.example.android.chattingapp V/MessageActivity: receiver is null: null

//updated
snapshot: DataSnapshot { key = -M9TzQuBbYfv-OhJgRyR, value = {message: =hahah, sender: =DuD8LfwlreNjByrptsh4zgXDQie2, receiver: =hFpPOfnvsKbJiZtfCBoGyDPnQXy2} }
chat variables: null, null, null
mchat: []

当尝试调试代码时,快照似乎具有如图所示的数据 The debug screen .

Edit-2:我包含了 Firebase 数据库数据的图像 Database data

Edit-3:我的聊天类(class)

public class Chat{

private String sender;
private String receiver;
private String message;

public Chat(String message, String sender, String receiver) {
this.sender = sender;
this.receiver = receiver;
this.message = message;
}

public Chat(){

}

public String getSender() {
return sender;
}

public void setSender(String sender) {
this.sender = sender;
}

public String getReceiver() {
return receiver;
}

public void setReceiver(String receiver) {
this.receiver = receiver;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}
}

最佳答案

现在尝试:

  1. 更改 onDataChange() 回调,分配适配器并构建完整数据后的 recyclerView(在 for 循环之外)
  2. 在继续之前检查 dataSnapshot.exits() 是否为 true

    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

    if (!dataSnapshot.exits())
    return;

    mChat.clear();
    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
    Chat chat = snapshot.getValue(Chat.class);

    assert chat != null;
    if ( chat.getSender().equals(myID) && chat.getReceiver().equals(userID) ||
    chat.getSender().equals(userID) && chat.getReceiver().equals(myID)) {
    mChat.add(chat) ;
    }

    }

    messageAdapter = new MessageAdapter(MessageActivity.this, mChat, imageURL);
    recyclerView.setAdapter(messageAdapter);
    }

关于java - DataSnapshot 无法创建自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62309433/

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