当发生昂贵的操作并且线程冻结时间超过 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 次执行排队,执行和生成的时间不会超过一秒,并将生成结果 B
、C
、D
.
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 -> {})
)
我正在像这样使用 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 次执行排队,执行和生成的时间不会超过一秒,并将生成结果B
、C
、D
. 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 -> {})
)