我使用 BehaviourRelay 作为源 observable,我喜欢它会在订阅时发出最后一个缓存的值,所以我不需要手动调用 showPlayingState(mPlayStateManager.getCurrentState())。
然而,当我想对订阅中的动画做出反应时,这会带来一个问题,因为我不想在这个缓存的发射上运行动画,当我订阅 onCreate 时会发射,UI 应该只是跳转到不对其进行动画处理的状态。动画应该只在“新”发射的情况下运行
这至少对我来说是一个相当常见的用例,但我在 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();
}
}