2

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

我有一个 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,它会触发redraw并分配资源,只需要在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,这不是真正的反应,对于这个异常用例有没有合适的解决方案?

4

1 回答 1

4

我认为这可以使用以下方法解决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))
于 2018-01-07T18:38:37.143 回答