2015-12-15 31 views
5

Sto utilizzando un RxAndroid observable per recuperare alcuni oggetti (String in questo caso). Il mio servizio è simile al seguente:Utilizzare la pianificazione con RxAndroid

public Observable<String> getRandomString() { 
    return Observable.create(new Observable.OnSubscribe<String>() { 
     @Override 
     public void call(Subscriber<? super String> subscriber) { 

      //code to retrieve result 

      subscriber.onNext("this is a string"); 
      subscriber.onCompleted(); 

     } 
    }); 
} 

mi iscrivo nel mio presentatore e postare il risultato alla vista:

public void loadRandomString() { 

    Observable<String> observable = mService.getRandomString(); 
    observable 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.newThread()) 
      .subscribe(new Subscriber<String>() { 
       @Override 
       public void onCompleted() { } 

       @Override 
       public void onError(Throwable e) { 
        mMainView.onError(e.getLocalizedMessage()); 
       } 

       @Override 
       public void onNext(String string) { 

        //do something with string 
       } 
      }); 
} 

Questo funziona bene e tutto, ma voglio questa operazione sia periodicamente (ogni x minuti). Potrei usare uno Timer o ScheduledThreadPoolExecutor per farlo più e più volte, ma mi piacerebbe vedere se c'è qualche soluzione nel regno di RxAndroid. Ho trovato alcune vecchie soluzioni dal 2013 ma gran parte del codice è deprecata in questo momento. È possibile utilizzare questo tipo di ricorsione, o posso ottenerlo in un modo più elegante?

Grazie in anticipo!

+0

è 'getRandomString' uguale a' getString'? – Blackbelt

+0

Sì! Ho cambiato alcuni nomi per motivi di semplicità. –

risposta

6

Quello che probabilmente si desidera è Observable.interval(). Emette su un intervallo temporizzato. È quindi possibile che nel vostro flatmap Observable<String>, in questo modo:

Observable.interval(3, TimeUnit.MINUTES) 
    .flatMap(new Func1<Long, Observable<String>>() { 
     @Override 
     public Observable<String> call(Long ignore) { 
     return getRandomString(); 
     } 
    }) 
    .subscribe(...insert your subscriber here...); 

Detto questo - se avete intenzione di fare questo ogni pochi minuti, si potrebbe essere meglio guardare in AlarmManager o JobScheduler, dal momento che è probabile che gli utenti non sarà focalizzato sulla tua app per quel lungo periodo di tempo.


Per inciso, sarebbe molto più facile da usare rispetto Observable.just("this is a string")Observable.create().

+0

Grazie per la tua risposta, questo sembra funzionare bene! L'ho cambiato in 'Observable.interval (0, 3, TimeUnit.MINUTES)' perché non voglio il ritardo all'inizio. Grazie per il tuo suggerimento su 'AlarmManager' ma questa non è la tua solita app, il caso d'uso è che l'app sarà in primo piano per giorni. Comunque sono confuso riguardo alla parte 'Observable.just()', nel mio post originale ho rimosso tutto il codice rilevante e ho appena inserito una stringa finta in 'onNext()', sicuramente con la logica originale 'Observable.just()' non sarebbe sufficiente? –

+0

@NielsMasdorp In quei casi io uso 'defer (() -> Observable.just())'. In questo modo puoi eseguire il codice prima che l'oggetto venga emesso. Il problema con l'uso di 'create()' è che tu (in teoria) devi gestire le richieste e la contropressione e questo è un vero dolore. –