2016-04-27 26 views
6

Ho notato che se eseguo una query in Firebase e il server del database non è raggiungibile, il callback attende solo per sempre (o fino a quando il server non è nuovamente raggiungibile).Come gestire il timeout nelle query con Firebase

Quando questo comportamento è del tutto naturale per l'approccio asincrono utilizzato, sarebbe comunque utile avere un modo semplice per specificare un timeout in modo da poter informare l'utente sullo stato.

Esiste una tale opzione e l'ho appena perso - o è davvero assente? O come risolverebbe questo problema?

+0

Se si sta tentando di rilevare se l'utente è connesso al server Firebase, dare un'occhiata a ['.info/connected'] (https://www.firebase.com/docs/web/guide/offline -capabilities.html # sezione-connection-state). –

+0

Stava affrontando lo stesso problema. Infine metti il ​​timer intorno alla query per contrassegnarlo come timeout. L'intero processo è stato facile da fare utilizzando il framework Boltz per il mantenimento delle attività (BFTask), specialmente nel caso in cui si abbiano a che fare con più query. – Amit

risposta

2

è possibile gestire autonomamente un timer controller che dopo x secondi rimuove l'ascoltatore dal riferimento Firebase. È molto semplice, solo una riga di codice in Android per esempio.

È possibile visualizzare il codice per il (sezione Rimozione richiamate) web: https://www.firebase.com/docs/web/guide/retrieving-data.html

o per Android (sezione Rimozione richiamate): https://www.firebase.com/docs/android/guide/retrieving-data.html#section-detaching

stessa sezione per IOS;)

+0

observSingleEventOfType, con questo non otteniamo un handle e quindi non sarà in grado di staccare il callback. – Amit

2

Come per oggi non esiste un concetto di timeout su quegli ascoltatori. Un'opzione è gestirla da solo.

Questo è il modo in cui lo faccio quando voglio anche visualizzare una finestra di dialogo durante il caricamento del contenuto.

private void showProgressDialog(boolean show, long time) { 
    try { 
     if (progressDialog != null) { 
      if (show) { 
       progressDialog.setMessage("Cargando..."); 
       progressDialog.show(); 
       new Handler().postDelayed(new Runnable() { 
        public void run() { 
         if(progressDialog!=null && progressDialog.isShowing()) { 
          progressDialog.dismiss(); 
          Toast.makeText(ActPreguntas.this, "Couldn't connect, please try again later.", Toast.LENGTH_LONG).show(); 
         } 
        } 
       }, time); 
      } else { 
       progressDialog.dismiss(); 
      } 
     } 
    }catch(IllegalArgumentException e){ 
    }catch(Exception e){ 
    } 
} 

Quindi, quando si effettua una richiesta per Firebase si chiama showProgressDialog (vero, 5000) e dopo 5 secondi se gli alambicchi di dialogo non c'è perché non potrebbe collegarsi e poi fare quello che hai da come per il timeout .

Sul richiamo di chi ascolta Firebase si esegue questa operazione showProgressDialog (false, 0)

Speranza che aiuta.

Problemi correlati