如何忽略combineLatest 中的一个可观察值,但在组合器函数中可以使用其最新值?

urS*_*Sus 3 android rx-java rx-java2 combinelatest

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

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

所以到目前为止的解决方案是

combineLatest(themeObservable, fontObservable, fontSizeObservable, 
    (theme, font, fontSize) -> new ReaderConfig(theme, font, fontSize))
Run Code Online (Sandbox Code Playgroud)

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

themeObservable.subscribe(__ -> activity.recreate())
Run Code Online (Sandbox Code Playgroud)

由于它重新启动了 Activity,因此不需要触发 mergeLatest,它会触发重绘并分配资源,只是因为重新启动而在 1 秒后被处理掉。

因此,只有 fontObservable 和 fontSizeObservable 更改应该触发 mergeLatest,但是我确实需要最新的 themeObservable 值才能构造 ReaderConfig 对象。

我的解决方法是这样的

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

    public ReaderConfig createReaderConfig() {
        return new ReaderConfig(mThemeRelay.getValue(), mFontRelay.getValue(), mFontSizeRelay.getValue());
    }
Run Code Online (Sandbox Code Playgroud)

所以基本上它在组合器函数中提取了themeObservable ,这并不是真正的反应性,对于这个异常用例有没有合适的解决方案?

ESa*_*ala 5

我认为这可以使用以下方法解决withLatestFrom(...)

仅当源 ObservableSource(此实例)发出项目时,才使用 resultSelector 函数将指定的 ObservableSource 合并到此 ObservableSource 序列中。

请参阅弹珠图: http: //rxmarbles.com/#withLatestFrom

例子:

.combineLatest(fontObservable, fontSizeObservable, 
    (font, size) -> new FontConfig(font, size))
.withLatestFrom(themeObservable,
    (fontConfig, theme) -> new ReaderConfig(theme, fontConfig.font, fontConfig.size))
Run Code Online (Sandbox Code Playgroud)