当发生昂贵的操作并且线程冻结时间超过 RxJava Interval period 时会发生什么

What happens when an expensive operation is happening and thread freezes for longer than RxJava Interval period

我正在像这样使用 RxJava 间隔:

compositeDisposable.add(
    Observable.interval(1, TimeUnit.SECONDS)
        .flatMap(tick -> {
            return Observable.just(doWork(tick));
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(this::updateUI, e -> {
            disableIndicator();
            FirebaseCrashlytics.getInstance().recordException(e);
        })
);

public Status doWork(long tick) {
    // Doing heavy task
    // Here the Status is an Enum class
    return output
}

public void updateUI(Status value) {
    // Updates UI accordingly
}

一切正常,但我有一个问题。所以我的 doWork() 方法在 bg 中做了一些繁重的任务,我正在根据 method.I 调用 doWork() 产生的结果更新 updateUI() 方法中的 UI 每秒 使用 RxJava Interval。通常执行 doWork() 方法需要不到一秒钟的时间。所以我只是想知道如果我有很多数据并且 doWork() 方法执行时间超过一秒会发生什么,假设它需要 2 seconds.But 间隔将继续调用 doWork()方法每秒。由于我之前的执行还需要一秒钟才能完成,我将获得什么 return 值?

所以事情是这样的:

  • 假设方法 doWork 执行命令的时间超过一秒,下一次执行会排队但不会延迟。
  • 让我们说在第 n 秒内,该方法执行了一些昂贵的事情,需要 3 秒才能完成,并将产生结果 A。由于该方法在 1 秒后执行,将有另外 3 次执行排队,执行和生成的时间不会超过一秒,并将生成结果 BCD.
  • n+3 秒后,您将同时获得所有四个结果。那将是 A B C D

所以如果你希望在 n+3 秒看到结果 A 并且在 1 秒后看到 B C D (意味着你不'想一次获得所有四个值),你需要做这样的事情:

Observable.timer(1, TimeUnit.SECONDS)
    .flatMap(tick -> {
        return Observable.just(doWork());
    })
    .repeat()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(value -> printUI(value), throwable -> {})
)