我通过填充一些观察者来触发长时间运行的CPU密集型任务,而且我无法确定我是否正确设置。
理想情况下,我的要求是:
我目前的解决方案就是这个,但我不确定这是否是最好的方法。特别是"版本"变量似乎错了。此外,在我的链中指定observeOn
似乎是错误的,但我知道这是使用BehaviorSubject的副作用。
final AtomicInteger version = new AtomicInteger(0);
return Observable.combineLatest(
mBehaviorSubjectArg1,
mBehaviorSubjectArg2,
mBehaviorSubjectArg3,
(arg1, arg2, arg3) -> new Arguments(version.incrementAndGet(), arg1, arg2, arg3)
)
// Only keep the latest combination so when observeOn pulls we don't run interim data points
.toFlowable(BackpressureStrategy.LATEST)
// Only buffer 1 so we don't ask for additional arguments until we have completed the last computation.
.observeOn(Schedulers.computation(), false, 1)
.map(args -> new Pair<>(args, mCalculator.run(args)))
.filter(pair -> pair.first.version == version.get())
.map(pair -> pair.second);
答案 0 :(得分:1)
这似乎是switchMap
运算符可以工作的完美示例。如果您可以更改mCalculator.run(args)
以返回Observable(如果使用Observable.create
和ObservableEmitter.setCancellable
可能允许取消),则以下代码将起作用:
return Observable.combineLatest(
mBehaviorSubjectArg1,
mBehaviorSubjectArg2,
mBehaviorSubjectArg3,
(arg1, arg2, arg3) -> new Arguments(arg1, arg2, arg3)
).switchMap((args) -> mCalculator.run(args).subscribeOn(Schedulers.computation()))
switchMap
将确保只有最新的Arguments
实例将同时运行,如果combineLatest
发出新实例,则取消Observable。 subscribeOn
中的switchMap
用于确保mCalculator.run