2016-05-12 20 views
5

Ho questo codice in cui ho impostato un valore. In modalità offline, scrive correttamente ma non chiama la funzione di callback CompletionListener.onComplete.Firebase offline no CompletionListener su setValue

newOrderRef.setValue(order, (firebaseError, firebase) -> { 
      if (firebaseError != null) { 
       Timber.e(firebaseError.toException(), "Order create failed, id: %s", order.getOrderId()); 
       subscriber.onError(firebaseError.toException()); 

      } else { 
       Timber.i("Order created, id: %s", order.getOrderId()); 
       newOrderRef.setPriority(0 - timestamp); 
       subscriber.onNext(firebase.getKey()); 
       subscriber.onCompleted(); 
      } 
     }); 

La richiamata non viene mai chiamata. Ma scrive bene.

In un altro caso, anche dopo aver annullato la sottoscrizione in onDestroy utilizzando CompositeSubscription, il sottoscrittore viene chiamato quando il valore arriva a scrivere sul server Firebase anche se il frammento non è in esecuzione.

È questo il comportamento corretto?

 Subscription orderSubscription = OrderManager.createOrder(order) 
         .subscribe(s -> { 
          fabShowSuccess(); 
          showSnackbar("onnext Order created " + order.getOrderId()); 
         }, throwable -> { 
          showSnackbar("Order failed. Make sure your are connected to internet."); 
          fabShowFailed(); 
         },() -> { 
          fabShowSuccess(); 
          showSnackbar("Order created " + order.getOrderId()); 
         }); 
       mCompositeSubscription.add(orderSubscription); 

In onDestroy() io chiamo mCompositeSubscription.unsubscribe();, ma l'abbonato viene chiamato più tardi.

risposta

3

Il listener di completamento per le operazioni di scrittura verrà richiamato quando la scrittura è stata eseguita nel database sui server Firebase. Quando sei offline, non succederà.

Non è possibile annullare l'iscrizione a un listener di completamento. Se il listener esiste ancora al termine dell'operazione di scrittura, verrà invocato.

+1

Grazie per la risposta. Ho risolto il problema controllando se la rete è disponibile e restituendo l'errore. – Arka

+2

Quindi c'è un altro modo per essere avvisati quando i dati sono stati scritti con successo nel database locale? Dopotutto, si tratta di un'operazione IO che potrebbe richiedere del tempo. Stavo pensando di impostare un listener di valori nella stessa posizione in cui sto per scrivere e attendere il callback onChanged (che viene chiamato correttamente). Tuttavia questo approccio non sembra troppo sicuro in quanto probabilmente dovrei controllare se il nuovo valore è uguale al valore che sto cercando di scrivere. Grazie per il feedback! –

+0

@KubaSpatny Ho anche lo stesso dubbio, c'è un modo per verificare se un valore è stato scritto nel database di Firebase locale? –

Problemi correlati