2015-06-05 3 views
8

Sto usando Firebase-backend per la mia applicazione Android. Mi piacerebbe creare un sistema di presenza degli utenti per la mia chat. A tal fine ho preso il modello da Firebase GuidaFirebase: quando l'evento onDisconnect si attiva?

final Firebase myConnectionsRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/users/joe/connections"); 

// stores the timestamp of my last disconnect (the last time I was seen online) 
final Firebase lastOnlineRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/users/joe/lastOnline"); 

final Firebase connectedRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/.info/connected"); 
connectedRef.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
    boolean connected = snapshot.getValue(Boolean.class); 
    if (connected) { 
     // add this device to my connections list 
     // this value could contain info about the device or a timestamp too 
     Firebase con = myConnectionsRef.push(); 
     con.setValue(Boolean.TRUE); 

     // when this device disconnects, remove it 
     con.onDisconnect().removeValue(); 

     // when I disconnect, update the last time I was seen online 
     lastOnlineRef.onDisconnect().setValue(ServerValue.TIMESTAMP); 
    } 
    } 

    @Override 
    public void onCancelled(FirebaseError error) { 
    System.err.println("Listener was cancelled at .info/connected"); 
    } 
}); 

il problema è che non so quando OnDisconnect evento sarebbe stato licenziato ?!

Ogni volta che apro l'app scrivo TRUE al nodo "users/joe/connections" ma quando ho chiuso l'app non sarebbe successo niente. Quando ho spento il WIFI, il parametro booleano non verrebbe rimosso. L'evento onDisconnect è stato attivato solo quando ho fermato forzatamente la mia app o reinstallato questa app o altrove quando non ero in grado di determinare.

Quindi, come ho capito bene che devo gestire tali manualmente gli eventi:

1) chiudere il mio app;

2) spegnere WiFi;

3) forse qualcos'altro

per la creazione di funzionalità di Presenza nella mia app? Ma poi quando è stato licenziato l'evento onDisconnect?

risposta

13

Ci sono due casi che possono accadere quando il client e il server sono scollegati:

  1. il cliente si disconnette in modo esplicito dal server
  2. il cliente scompare semplicemente

Quando si uccide l'applicazione , stai attivando una disconnessione esplicita. In tal caso il client invierà un segnale al server che si sta disconnettendo e il server eseguirà immediatamente la richiamata onDisconnect.

Quando si spegne la rete Wi-Fi, l'app non ha la possibilità di comunicare al server che si sta disconnettendo. In tal caso, lo onDisconnect si attiva quando il server rileva che il client è scomparso. Questo potrebbe richiedere alcuni minuti, a seconda di come sono configurati i timeout per i socket. Quindi in quel caso devi essere un po 'più paziente.

+0

Non capisco. Quando un utente preme il pulsante INDIETRO e chiude tutte le attività, onDisconnect() non attiva. Ma in questa situazione, l'utente dovrebbe considerare offline, giusto? – iForests

+1

@iForests Penso che per 'Quando un utente preme il pulsante INDIETRO e chiude tutte le attività' deve essere gestito in _ActivityLifecycleCallbacks_ – rookieDeveloper

+0

@Frank_van_Puffelen quanto tempo ci vuole al suo massimo affinché il server rilevi che il client è sparito? e questo non è pratico perché il server impieghi alcuni minuti perché andare offline dovrebbe immediatamente attivare le relative funzioni nel server Firebase in modo che gli utenti ne comprendano lo stato. –

0

Quando l'utente sta uscendo dall'app, è possibile chiamare admin.database().goOffline() per disconnettersi esplicitamente dal firebase, che deve attivare il callback onDisconnect. Quando l'utente torna all'app, chiama semplicemente admin.database().goOnline() per riconnetterti con Firebase.