我有这个真实世界的场景。
我有一个 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,这不是真正的反应,对于这个异常用例有没有合适的解决方案?