Ich bin sehr seltsames Problem mit firebase
konfrontiert, habe ich Daten im angefügten Format in firebase
und ich versuche, die Daten wiederherzustellen gesamte recyclerview
Adapterliste abrufen, wenn einer der untergeordneten Knoten für diese Konversation geändert.Firebase onChildChanged Listener wird zweimal gefeuert
Wenn ich es mit Debugger ausgeführt, es onChildChanged()
nur einmal ausgelöst, aber ansonsten zweimal ausgelöst, bitte helfen.
private void getConversations(){
final DatabaseReference conversationRef = databaseReference.child("conversation").child(currentUser);
// Get event fired when new child added
conversationRef.orderByChild("time").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
String ref= dataSnapshot.getKey();
int position = userListRef.size();
userListRef.add(position,ref);
getDetailedConversations(position);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {
userListRef.clear();
conversationListRef.clear();
conversationAdapter.clear();
//conversationAdapter.notifyDataSetChanged();
Log.d(TAG, "new position: data changed+++++++++++++++++++++");
conversationRef.removeEventListener(this);
getConversations();
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
private void getDetailedConversations(final int position){
DatabaseReference databaseReferenceAdapter = FirebaseDatabase.getInstance().getReference();
final DatabaseReference conversationRef = databaseReferenceAdapter.child("conversation").child(currentUser).child(userListRef.get(position));
conversationRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(TAG,"Single value event");
final Conversation conversation = dataSnapshot.getValue(Conversation.class);
conversation.setFirebaseToken(dataSnapshot.getKey());
conversationListRef.add(conversation);
conversationAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
LogCat:
11-07 22:56:01.127 15524-15577/io.ace.aceme E/Surface:
getSlotFromBufferLocked: unknown buffer: 0x9b9e2860
11-07 22:56:02.618 15524-15573/io.ace.aceme V/FA: Inactivity,
disconnecting from AppMeasurementService
11-07 22:56:05.566 15524-15524/io.ace.aceme D/MessagesActivity: new
position: data changed+++++++++++++++++++++
11-07 22:56:05.570 15524-15524/io.ace.aceme D/MessagesActivity:
Single value event
11-07 22:56:05.785 15524-15524/io.ace.aceme D/MessagesActivity: new
position: data changed+++++++++++++++++++++
11-07 22:56:05.785 15524-15524/io.ace.aceme D/MessagesActivity:
Single value event
11-07 22:56:05.786 15524-15524/io.ace.aceme D/MessagesActivity:
Single value event
11-07 22:56:06.134 15524-15524/io.ace.aceme D/MessagesActivity:
Single value event
11-07 22:56:06.134 15524-15524/io.ace.aceme D/MessagesActivity:
Single value event
11-07 22:56:06.137 15524-15524/io.ace.aceme D/MessagesActivity:
Single value event
11-07 22:56:07.393 15524-15573/io.ace.aceme V/FA: Activity paused,
time: 16426758
11-07 22:56:07.398 15524-15573/io.ace.aceme V/FA: Activity resumed,
time: 16426764
Firebase
Datenbank:
Database pic
OnDataChange Sie Entfernen und Hinzufügen von Hörer wieder, es ist nicht required.And auch Sie versuchen, Order-by und Kind Ereignis-Listener zu kombinieren, dass nicht Gebrauchswert Ereignis listner – Shanmugam
@Shanmugam Zuhörer empfohlen muss entfernt werden, sonst würde es noch mehr Hörer aufsetzen, ich habe es schon früher ausprobiert. Es hilft nicht. – tan90
Noch schockierender ist es, wenn ich es im Debug-Modus benutze, es einmal aufgerufen, aber ich normal ausgeführt es 2 mal an jedem Kind change aufgerufen. – tan90