簡體   English   中英

在RxJava中調用onNext之間暫停

[英]Pause between call onNext in 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毫秒的暫停

那么您可以使用間隔運算符,它將在指定的時間間隔后發出項目,並使用take運算符僅使用所需數量的流項目

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

        }
        });

一種方法是使用zip將您的observable與Interval observable結合起來以延遲輸出。

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

如果你想要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)

如果你想每100ms“采樣”一次,那么創建一些隨機數然后使用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM