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 ,这并不是真正的反应性,对于这个异常用例有没有合适的解决方案?
我认为这可以使用以下方法解决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)
| 归档时间: |
|
| 查看次数: |
3101 次 |
| 最近记录: |