2

私はこの現実世界のシナリオを持っています。

ReaderConfig オブジェクトがあります。これは、ReaderTheme、ReaderFont、ReaderFontSize のダム タプルです。その変更により、readerConfigObservable がトリガーされ、再描画が行われます。

したがって、ソリューションソファは

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

ただし、これは android であるため、ReaderTheme は android R.theme を設定します。それらを有効にするには、アクティビティを再起動する必要があります。だから私は自分自身でthemeObservableを公開する必要があります

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

アクティビティを再起動するため、combineLatest をトリガーする必要はありません。これにより、再描画がトリガーされ、リソースが割り当てられますが、再起動のために 1 秒後に破棄されるだけです。

そのため、fontObservable と fontSizeObservable の変更のみが CombineLatest をトリガーする必要がありますが、ReaderConfig オブジェクトを構築するには、最新の themeObservable 値が必要です。

私の回避策はこれです

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 に答える