Hallo Community,
ich bin neu hier und hoffe auf Hilfe, da ich relativ ein Anfänger in Android Studio bin aber ich versuche durch Tutorials etc. zu lernen.
Ich bin jedoch auf ein Problem gestoßen und komme einfach nicht weiter, Stackoverflow oder sonst wo, selbst das Video dreimal angeschaut um zu schauen, wo mein Problem liegt. Komierscherweise hat er das Problem nicht. Ich verstehe nicht warum und zwar ist es ein:
"com.example.networkusercommunication, PID: 20662 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference at com.example.networkusercommunication.ChatActivity$5.onDataChange(ChatActivity.java:248)" - Hier Zeile 50 bei getReceiver(). Bei getSender() ist aber alles in Ordnung, ich verstehe das nicht.
In seinem nächsten ( bzw. meinem jetzigen ) Video zeigte er, wie man eine Nachricht im Chat löscht, dabei zeigte er zwei Methoden. 1. Einfaches Löschen und 2. Die Nachrichten durch:" Diese Nachricht wurde gelöscht " ersetzen. Zum Test probierte ich beides, wie im Tutorial gezeigt. Mir gefällt die zweite Variante besser, deshalb löschte ich die Zeile für Variante 1. Doch dann fing das Problem an. Zuvor funktioniert alles wunderbar, gestern keine Problem aber jetzt geht es nicht mehr. Ich öffne die App und bis zum "Users" Fenster, wo sich alle registrierten Benutzer auffinden, funktioniert alles, wenn ich auf einen Benutzer klicke/drücke, um das Chatfenster zu öffnen, stürzt die ab einfach ab mit dem obigen Error im Logcat. Wie kann ich das Lösen?
[Musste den Code kürzen, sonst hat es nicht gepasst, hoffe, dass hier das Wichtige vorhanden ist]
/
// check edit text change listener
messageEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.toString().trim().length() == 0 ) {
checkTypingStatus("noOne");
} else {
checkTypingStatus(hisUid); // uid of receiver
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
readMessages();
seenMessage();
}
private void seenMessage() {
userRefForSeen = FirebaseDatabase.getInstance().getReference("Chats");
seenListener = userRefForSeen.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
ModelChat chat = ds.getValue(ModelChat.class);
if ( chat.getReceiver().equals(myUid) && chat.getSender().equals(hisUid)) {
HashMap<String, Object> hasSeenHashMap = new HashMap<>();
hasSeenHashMap.put("isSeen", true);
ds.getRef().updateChildren(hasSeenHashMap);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void readMessages() {
chatList = new ArrayList<>();
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("Chats");
dbRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
chatList.clear();
for (DataSnapshot ds : dataSnapshot.getChildren()) {
ModelChat chat = ds.getValue(ModelChat.class);
if (chat.getReceiver().equals(myUid) ||
(chat.getReceiver().equals(hisUid) && chat.getSender().equals(myUid))) {
chatList.add(chat);
}
// adapter
adapterChat = new AdapterChat(ChatActivity.this, chatList, hisImage);
adapterChat.notifyDataSetChanged();
// set adapter to recyclerview
recyclerView.setAdapter(adapterChat);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void sendMessage(String message) {
/* "Chats" node will be created, that will contain all chats. Whenever user
* sends message it will create a new child in "Chats" node and that child
* will contain the following key values.
* sender: UID of sender
* receiver: UID of receiver
* message: the actual message
*/
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
String timestamp = String.valueOf(System.currentTimeMillis());
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("sender", myUid);
hashMap.put("receiver", hisUid);
hashMap.put("message", message);
hashMap.put("timestamp", timestamp);
hashMap.put("isSeen", false);
databaseReference.child("Chats").push().setValue(hashMap);
// reset edittext after sending message
messageEt.setText("");
}
private void checkUserStatus() {
// get current user
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// user is signed in stay here
//set email of logged in user
//mProfileTv.setText(user.getEmail());
myUid = user.getUid(); // currently signed in user's uid
} else {
// user not signed in, go to main activity
startActivity(new Intent(this, MainActivity.class));
finish();
}
}
private void checkOnlineStatus(String status) {
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("Users").child(myUid);
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("onlineStatus", status);
// update value of onlineStatus of current user
dbRef.updateChildren(hashMap);
}
private void checkTypingStatus(String typing) {
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("Users").child(myUid);
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("typingTo", typing);
// update value of onlineStatus of current user
dbRef.updateChildren(hashMap);
}
}
return super.onOptionsItemSelected(item);
}
}
Display More
public class ModelChat {
String message, receiver, sender, timestamp;
boolean isSeen;
public ModelChat() {
}
public ModelChat(String message, String receiver, String sender, String timestamp, boolean isSeen) {
this.message = message;
this.receiver = receiver;
this.sender = sender;
this.timestamp = timestamp;
this.isSeen = isSeen;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public boolean isSeen() {
return isSeen;
}
public void setSeen(boolean seen) {
isSeen = seen;
}
}
Display More