2015-10-21 7 views
9

Sto lavorando a un progetto Android che effettua richieste di retrofit utilizzando Rx-Java osservabile e abbonati.Come respingere una richiesta reattiva di retrofit in java?

Tuttavia, in alcune interazioni questa richiesta può essere richiamata più volte e vorrei eseguire solo l'ultima in una finestra temporale predefinita (antirimbalzo).

ho cercato di applicare l'operatore debounce direttamente osservabile, ma non funzionerà perché il codice qui sotto viene eseguito ogni volta che si verifica una certa interazione:

mApi.getOnlineUsers() 
    .debounce(1, TimeUnit.SECONDS) 
    .subscribe(...) 

Credo che dovrebbe essere creato un solo osservabile e ogni interazione dovrebbe "aggiungere" l'esecuzione allo stesso osservabile. Ma io sono un po 'nuovo su Rx Java e non so esattamente cosa fare.

Grazie!

risposta

8

Supponiamo di voler avviare un'esecuzione in base ad un evento di attivazione.

Observable<Event> trigger = ... // e.g. button clicks 

È possibile trasformare gli eventi di trigger per le chiamate al API in questo modo:

trigger 
    .debounce(1, TimeUnit.SECONDS) 
    .flatMap(event -> mApi.getOnlineUsers()) 
    .subscribe(users -> showThemSomewhere(users)); 

Inoltre, si noti che l'operatore debounce avrà l'ultima occorrenza nei tempi, ma throttlefirst volontà prendi lo prima. Puoi usare l'una o l'altra in base al tuo caso d'uso.

+0

Buon punto, e si potrebbe anche considerare l'utilizzo di [PublishRelay] (https://github.com/JakeWharton/RxRelay) – miroslavign