如何忽略 combineLatest 中的一个 observable,但在 combiner 函数中有最新可用的?

How to ignore one of observables in combineLatest, but have its latest available in the combiner function?

我有这个真实世界的场景。

我有一个 ReaderConfig 对象,它是 ReaderTheme、ReaderFont、ReaderFontSize 的哑元组。它的更改将触发 readerConfigObservable,然后重绘内容。

所以目前的解决方案是

combineLatest(themeObservable, fontObservable, fontSizeObservable, 
    (theme, font, fontSize) -> new ReaderConfig(theme, font, fontSize))

但是,因为这是 android,ReaderTheme 设置了一些 android R.theme。东西,需要重新启动 Activity 才能生效。所以我也需要自己公开 themeObservable

themeObservable.subscribe(__ -> activity.recreate())

由于重启了activity,所以不需要触发combineLatest,触发重绘分配资源,只在1秒后因为重启被丢弃

所以只有 fontObservable 和 fontSizeObservable 的变化应该触发 combineLatest,但是我确实需要最新的 themeObservable 值来构造 ReaderConfig 对象。

我的解决方法是这样

public Observable<ReaderConfig> readerConfigObservable() {
        return Observable.combineLatest(
                mFontRelay, mFontSizeRelay, (__, ___) -> createReaderConfig());
    }

    public ReaderConfig createReaderConfig() {
        return new ReaderConfig(mThemeRelay.getValue(), mFontRelay.getValue(), mFontSizeRelay.getValue());
    }

所以基本上它组合器函数中的themeObservable,它不是真正的反应,对于这个异常使用有什么合适的解决方案案例?

我认为这可以使用 withLatestFrom(...):

来解决

Merges the specified ObservableSource into this ObservableSource sequence by using the resultSelector function only when the source ObservableSource (this instance) emits an item.

查看弹珠图:http://rxmarbles.com/#withLatestFrom

示例:

.combineLatest(fontObservable, fontSizeObservable, 
    (font, size) -> new FontConfig(font, size))
.withLatestFrom(themeObservable,
    (fontConfig, theme) -> new ReaderConfig(theme, fontConfig.font, fontConfig.size))