2015-10-22 14 views
5

Chcę wykonać połączenie z serwisem internetowym za pomocą modernizacji co x sekund, aż stan Y zostanie podniesiony.RXJava, jak spróbować uzyskać następną po X czasie

Chcę uruchomić OrderApi.get po x sekundach, aż odpowiedź będzie pusta.

public class OrderApi {} 
    public static Observable<Order> get() { 
     //... 
    } 
} 


OrderApi.get(order.getId())) 
     .subscribe(updatedOrder -> { 
      mShouldRun = updatedOrder != null; 
     }); 

Już operatorów pił jak Observable.delayObservable.timber ale nie mogę znaleźć sposób, aby ich używać prawidłowo.

Odpowiedz

4

to powinno działać

Observable.interval(1, TimeUnit.SECONDS) 
       .flatMap(new Func1<Long, Observable<?>>() { 
        @Override 
        public Observable<?> call(Long aLong) { 
         return OrderApi.get(); 
        } 
       }).takeUntil(new Func1<Object, Boolean>() { 
      @Override 
      public Boolean call(Object o) { 
       return o==null; 
      } 
     }).subscribe(observer); 
+1

Wybieram tę odpowiedź, ponieważ 'Observable.interval' emituje obiekty na zawsze, dopóki' takeUntil' nie będzie fałszywe. 'Observable.timer' po prostu poczekaj x czas na wyemitowanie jednego obiektu. – Caipivara

1

kombinacja timer i repeat powinien zrobić to

Observable.timer(1000, TimeUnit.MILLISECONDS) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .repeat(Schedulers.io()) 
     .subscribe(new Action1<Object>() { 
      @Override 
      public void call(Object aLong) { 
       System.out.println(System.currentTimeMillis()); 
      } 
     }); 

callback call nazywa co 1 sek

+0

i kiedy przestać? jak mogę sprawdzić nieruchomość i zatrzymać obserwowalne? – Caipivara

+1

'subscribe' zwraca opcję' Subscription'. Stary odnośnik i wywołaj 'unsubscribe()' gdy chcesz go zatrzymać – Blackbelt

+0

Wybieram tę odpowiedź, ponieważ 'Observable.interval' emituje obiekty na zawsze, dopóki takeUntil nie będzie fałszem. 'Observable.timer' po prostu poczekaj x czas na wyemitowanie jednego obiektu. – Caipivara