0
即时使用BehaviourourRelay作为源observable,我喜欢它会发出订阅时最后缓存的值,所以我不需要手动调用showPlayingState(mPlayStateManager.getCurrentState())。如何知道可观察的发射是否是缓存的BehaviourSubject值?
但是这会带来一个问题,当我想在订阅中对动画做出反应时,因为我不想在这个缓存的发射中运行动画,当我在onCreate中订阅时,它会被命中,UI应该跳转到没有动画的状态到它。动画应该只运行在一个“新鲜”的情况下发出
这是一个相当普遍的用例ATLEAST我,但有麻烦林在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没有初始默认值,可能是空的,那么在订阅时,这些队伍不会被缓存,并且第一个“新鲜”排放将被错误地对待。顺便说一句,这取决于它的行为继续,你不应该知道的事实,因此hide(),有没有我的方式,我可以编码它发射的数据呢? – urSus