【发布时间】:2017-10-20 18:15:42
【问题描述】:
我使用 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();
}
}
【问题讨论】:
标签: android rx-java behaviorsubject