2015-10-22 30 views
5

我希望每x秒使用一次改進來調用Web服務,直到y條件被提出。RXJava如何在x時間之後嘗試下一步

我想在x秒後運行OrderApi.get,直到響應爲空。

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


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

已經看到運營商如Observable.delayObservable.timber但我不能找到一種方法來正確地使用它們。

回答

4

這應該工作

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

我選擇這個答案,因爲'Observable.interval'會永遠發射對象,直到'takeUntil'爲false。 'Observable.timer'只需等待x時間發出一個對象。 – Caipivara

1

timerrepeat組合應該這樣做

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()); 
      } 
     }); 

回調call被稱爲每1秒

+0

以及何時停止?我怎樣才能查看房產並做出可觀察的止損? – Caipivara

+1

'訂閱'返回'訂閱'選項。舊的參考和調用'unsubscribe()',當你想停止它 – Blackbelt

+0

我選擇這個答案,因爲'Observable.interval'永遠發射的對象,直到takeUntil是假的。 'Observable.timer'只需等待x時間發出一個對象。 – Caipivara

相關問題