2015-11-18 40 views
11

Ho un elenco di chat room per un determinato utente in una posizione e il numero totale di messaggi per una determinata chat room in un'altra posizione. Voglio tenere traccia di un certo numero di messaggi a cui l'utente di chat room appartiene.Come tenere traccia degli ascoltatori in Firebase su Android?

ho un seguente frammento:

//getting all chat rooms this user belongs to 
mFirebase.child("myChatRooms").child("testUser").addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded (DataSnapshot dataSnapshot, String previousKey){ 
     for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
      ChatRoom myRoom = postSnapshot.getValue(ChatRoom.class); 

      //listening to message count in every chat room user belongs to 
      mFirebase.child("chatRoomMessageCount").child(postSnapshot.getKey()).addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
         //number of messages have changed 
       } 

       @Override 
       public void onCancelled(FirebaseError firebaseError) { 

       } 
      }); 
     } 
    } 

    //...... 
} 

La domanda è: come faccio a rimuovere tutte quelle di seguito ValueEventListener, quando sarà chiamato onChildRemoved, o io non più bisogno di loro?

Qual è l'approccio consigliato per gestire questa situazione? Devo memorizzare la chiave figlio e l'ascoltatore in HashMap e tenerne traccia personalmente o c'è un modo per rimuovere tutti gli ascoltatori per una data posizione di Firebase?

risposta

18

Un dato modo coscienzioso potrebbe essere quella di creare un HashMap di ValueEventListeners e poi in onStop o onDestroy si dovrebbe rimuovere quelle ascoltatori.

Per semplificare le cose, è necessario utilizzare un singolo listener di eventi per ottenere le stanze. Quindi per ogni stanza è possibile creare un ascoltatore in tempo reale.

public class MainActivity extends Activity { 

    private Firebase mRef; 
    private HashMap<Firebase, ValueEventListener> mListenerMap; 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     mRef = new Firebase("https://<your-firebase-app>/myChatRooms/testUser"); 

     mRef.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 

        ValueEventListener listener = new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          // do your thing here 
         } 

         @Override 
         public void onCancelled(FirebaseError firebaseError) { 

         } 
        }; 
        mListenerMap.put(postSnapshot.getRef(), listener); 
        Firebase childRef = mRef.child("chatRoomMessageCount").child(postSnapshot.getKey()); 
        childRef.addValueEventListener(listener); 
       } 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 

      } 
     }); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     for (Map.Entry<Firebase, ValueEventListener> entry : mListenerMap.entrySet()) { 
      Firebase ref = entry.getKey(); 
      ValueEventListener listener = entry.getValue(); 
      ref.removeEventListener(listener); 
     } 
    } 
} 
+1

Questo è fondamentalmente quello che avevo in mente. Speravo davvero che ci sarebbe stato un modo più elegante per farlo, o funzionalità simili già integrate. Ad esempio, potremmo passare TAG come secondo parametro a addValueEventListener e quindi chiamare semplicemente qualcosa come removeValueEventListenersWithTag. Ma, immagino dato il tempo reale e la natura continua di Firebase, voi ragazzi avete deciso di lasciarlo agli sviluppatori, il che è ok, ma dovete rifletterlo nei documenti. I dati flat spesso portano a listener nidificati e potrebbe confondere chi è nuovo al concetto. – Sver

+3

Sono d'accordo. Farò più ricerche su una soluzione più elegante. Apprezzo molto il tuo feedback! –

+0

Questo soddisfa i requisiti di una risposta accettata per te? O ci sono altre considerazioni? –

Problemi correlati