Ich entwickle eine Chat-App, die viele Chatrooms hat, wenn jemand auf den Chat-Room geantwortet hat, wird er automatisch abonniert.Wie kann ich ungelesene Nachrichten abfragen?
My Firebase Datenbank-Struktur ist:
chats
--chatID
----chatName
----user
unreadMessages
--chatID
----messageID
------userID
Ich habe versucht, den Code so viel wie möglich für Sie zu kommentieren, so wäre es einfacher zu lesen.
Nun, auf meiner MainActivity Frage ich alle Chatrooms zu bekommen, und ich möchte auch die ungelesenen Nachrichten Nummer zu bekommen. Dies erfordert mehrere verschachtelte Abfragen, und das Problem ist, dass sie alle zu unterschiedlichen Zeiten auftreten. Daher kann ich nicht wissen, wann die inneren Schleifen beendet sind und wann die Firebase-Abfragen enden.
Es bedeutet, dass es in der letzten Zeile den Chatroom mit 0 ungelesenen Nachrichten wegen des Timings hinzufügt.
Hoffe, du könntest mir hier helfen, ich habe fast alles ausprobiert, und stundenlanges Frustrieren hat mir überhaupt nicht geholfen.
DatabaseReference chatsRef = database.getReference("chats");
chatsRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
final String chatRoomID = dataSnapshot.getKey(); //get chatID
//handle unread messages
DatabaseReference unreadMessagesRef = database.getReference("unreadMessages").child(chatRoomID);
unreadMessagesRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Long totalMessagesNum = dataSnapshot.getChildrenCount(); //total messages in this chatroom
//get every message
for (DataSnapshot message : dataSnapshot.getChildren()) {
String messageID = message.getKey(); //get messageID
DatabaseReference singleMessageRef = database.getReference("unreadMessages").child(chatRoomID).child(messageID);
singleMessageRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot user : dataSnapshot.getChildren()) {
String userID = user.getValue(String.class);
if(userID == currentLoggedUser.getID()){
//the user have read this message, substract from the total messages
totalMessagesNum--;
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Log.i("total unread messages in this chat is " + totalMessagesNum);
//add the chat to the listview
chatsAdapter.add(new Chat(chatRoomID,totalMessagesNum))
}
...
});