-1

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

image1

+0

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

+0

@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

+0

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

Antwort

0

Hier wird die aktualisierte Abfrage, keine Notwendigkeit zu verwenden orderBy

private void getConversations(){ 

final DatabaseReference conversationRef = databaseReference.child("conversation").child(currentUser); 

// Get event fired when new child added 
conversationRef.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) { 
      //Here no need to clear and reload 
      //just find the user in list and update the corresponding object and call notifyDatasetChanged() 

    } 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot) {} 

    @Override 
    public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {} 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 


}); 

}

+0

Danke dafür! aber es löst meinen Zweck nicht, wenn ich die Reihenfolge durch lösche. Ich wäre nicht in der Lage, die Konversation zeitabhängig zu sortieren, wenn sich der Kindknoten ändert. – tan90

Verwandte Themen