嗨,我正在尝试制作一个聊天应用。在此过程中,IAM尝试检索存储在数据库中的消息,但IAM获取了一个Null Object引用异常。
我用来向数据库添加消息的代码是:
img_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg = text_send.getText().toString();
if(!msg.equals(""))
sendMessage(fuser.getUid(), currUserId, msg);
else
Toast.makeText(MessageActivity.this, "Enter Something",
Toast.LENGTH_SHORT).show();
}
});
private void sendMessage(String sender,String receiver,String message)
{
DatabaseReference reference =
FirebaseDatabase.getInstance().getReference();
HashMap<String,Object>hashMap = new HashMap<>();
hashMap.put("sender",sender);
hashMap.put("receiver",receiver);
hashMap.put("message",message);
reference.child("Chats").push().setValue(hashMap);
}
注意:以上代码部分工作正常。每次发送消息时,我的数据库都会正确更新。
在这部分之后,我尝试使用以下代码显示用户的消息
DatabaseReference chatref =
FirebaseDatabase.getInstance().getReference().child("Chats");
ArrayList<String> userchats = new ArrayList<>();
listView = findViewById(R.id.listView);
final ArrayAdapter <String> arrayAdapter = new ArrayAdapter<String>
(this,android.R.layout.simple_list_item_1,userchats);
listView.setAdapter(arrayAdapter);
chatref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot,
@Nullable String s) {
String value = dataSnapshot.getValue().toString();
try {
JSONObject object = new JSONObject(value);
message = object.getString("message");
}
catch (JSONException e) {
e.printStackTrace();
}
userchats.add(message);
arrayAdapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot,
@Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot,
@Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
这时我运行该应用程序时,我得到了错误,并且我的堆栈跟踪如下:
Process: com.kcw.firebasebasics, PID: 10943
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String java.lang.Object.toString()' on a null object
reference at android.widget.ArrayAdapter.
createViewFromResource(ArrayAdapter.java:401)
at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369)
at android.widget.AbsListView.obtainView(AbsListView.java:2346)
at android.widget.ListView.makeAndAddView(ListView.java:1875)
最后是我的数据库图片:
答案 0 :(得分:1)
更改此:
String value = dataSnapshot.getValue().toString();
对此:
String value = dataSnapshot.child("message").getValue(String.class);
答案 1 :(得分:0)
您的chatref
引用的“聊天”键巫婆不是字符串。这就是为什么你得到
在空对象上的'java.lang.String java.lang.Object.toString()'
您应该将dataSnapshot解析为类似此示例的类
Comment comment = dataSnapshot.getValue(Comment.class);
并且Comment
类具有message
receiver
Sender
变量
从Firebase文档中选中此Work with Lists of Data
最后,这是Firebase Android Codelab,展示了如何创建一个名为“友好聊天”的完整聊天应用