im BehaviourRelayをソースとして使用すると、サブスクリプション時に最後にキャッシュされた値が放出されるのが好きなので、showPlayingState(mPlayStateManager.getCurrentState())を手動で呼び出す必要はありません。observable emitがキャッシュされたBehaviourSubject値であるかどうかを知る方法?
しかし、これは、onCreateを購読するとエミットされるこのキャッシュされたエミットでアニメーションを実行したくないので、サブスクリプションのアニメーションに反応したいときに問題になります。UIはアニメーション化されない状態にジャンプする必要がありますそれに。アニメーションは、これが私のために少なくともかなり一般的なユースケースですが、私が正しくあなたの質問を理解していればImはRX
class Activity {
PlayStateManager mPlayStateManager;
Button mButton;
void onCreate(SavedinstanceState state) {
mPlayStateManager.playState()
.subscribe(state -> {
switch(state) {
case PlayState.PLAYING:
showPlayingState(true, ???);
break;
case PlayState.PAUSED:
showPlayingState(false, ???);
break;
}
}
}
void showPlayingState(boolean isPlay, boolean animate) {
if(!animate) {
mButton.setText(isPlay ? "Playing" : "Paused");
} else {
mButton.animate()
.rotate(360)
.onAnimationEnd(() -> {
mButton.setText(isPlay ? "Playing" : "Paused");
})
}
}
}
class PlayStateManager {
BehaviourRelay<PlayState> mSubject = new BehaviourRelay();
public void set(PlayState state) {
mSubject.accept(state);
}
public Observable<PlayState> playState() {
return mSubject.hide();
}
}
はい、対象はキャッシュされた値なしで空になることがあります – urSus
そして?あなたの質問はそのような場合の行動を説明していませんでした。コードは、値が定義されるのを待っていることを示しました。 –
どういう意味ですか? behaviourrelayは初期のデフォルト値を持たず、thereforceは空であり、thereforceはサブスクライブ時にキャッシュされず、最初の「新鮮な」放出はそれ自体が間違って扱われる。それはあなたが知ってはならないbehaviourrelay、つまりhide()という事実に依存しています。私はおそらく放出されるデータでそれをエンコードすることができますか? – urSus