2016-02-23 86 views
1

如何使onNext方法調用之間的延遲?我有一個代碼:在RxJava中調用onNext之間暫停

Observable<Integer> obs = Observable.range(1, 1000) 
        .subscribeOn(Schedulers.io()) 
        .observeOn(AndroidSchedulers.mainThread()); 
      subs = obs.subscribe(new Subscriber<Integer>() { 
       @Override 
       public void onNext(Integer number) { 
        mCurrentNumber = number; 
        mCounter.setText(String.valueOf(number)); 
       } 

       @Override 
       public void onCompleted() { 
        isRunning = false; 
       } 

       @Override 
       public void onError(Throwable e) { 

       } 
      }); 

例如,我需要設置一個暫停100毫秒

做到這一點是使用壓縮到您觀察到的結合與時間間隔觀察到的延遲輸出
+0

你想'setText'數字是:'1,2,3 ... 1000'還是'1,100,200 ... 1000',或者隨機選擇100像'1,97,102,203 ....'? – Diolor

回答

2

那麼你可以使用interval運營商在指定的時間間隔後,將發出的商品,需要操作人員使用的流項目,才需要數

Observable.interval(100, TimeUnit.MILLISECONDS) 
     .take(1000) 
     .subscribe(new Action1<Long>() { 
      @Override public void call(Long timerValue) { 

     } 
     }); 
0

的一種方式。

Observable.zip(Observable.range(1, 5) 
    .groupBy(n -> n % 5) 
    .flatMap(g -> g.toList()), 
Observable.interval(50, TimeUnit.MILLISECONDS), 
(obs, timer) -> obs) 
.doOnNext(item -> { 
    System.out.println(System.currentTimeMillis() - timeNow); 
    System.out.println(item); 
    System.out.println(" "); 
}).toList().toBlocking().first(); 
0

如果你想1,2,3...1000這個怎麼樣:

subs = Observable.interval(0, 100, TimeUnit.MILLISECONDS, Schedulers.io()) 
     .take(1000) 
     .map(counter -> counter++) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Subscriber<Long>() { 
      @Override 
      public void onNext(Long number) { 
       mCurrentNumber = number; 
       mCounter.setText(String.valueOf(number)); 
      } 

      @Override 
      public void onCompleted() { 
       isRunning = false; 
      } 

      @Override 
      public void onError(Throwable e) { 

      } 
     }); 
  • .interval將在IO
  • 運行
  • 這將立即開始發射物品0L, 1L, 2L......infinity
  • .take(1000)會第一時間1000個項目,然後停止(完成)
  • .map(counter -> counter++)將改變以上1L, 2L,......infinity因爲你從1在你的榜樣請求1000,而不是0到1000

如果你想100,200,300然後使用.map(counter -> counter*100)

如果你想「樣品」每100毫秒的範圍內,從而創造一個位的隨機數,然後使用:

Observable.range(1, 1000) 
     .subscribeOn(Schedulers.io()) 
     .sample(100, TimeUnit.MILLISECONDS) 
     ...... 
     //rest here 
+0

只有一個更正:.interval操作符在計算調度程序上默認運行,而不在IO上運行。 – nicopasso

+0

@nicopasso,這是正確的。在我的例子中,但它會在IO上運行:) – Diolor

+0

哦對了對不起,我已經完全錯過了:) – nicopasso