如何知道可观察的发射是否是缓存的BehaviourSubject值?
问题描述:
即时使用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();
}
}
答
想出来的。如果我正确地理解你的问题,如果playState()
是较旧的信息,但只有在切换状态时才会执行动画。换句话说,在onCreate()
的初始调用中,您不想执行动画,但如果值发生更改,则需要执行动画。
enum PlayStateExpanded {
UNKNOWN,
PLAYING,
PAUSED
}
class PlayStateManager {
BehaviourRelay<PlayStateExpanded> mSubject =
new BehaviourRelay(PlayStateExpanded.UNKNOWN);
public void set(PlayState state) {
mSubject.accept(
state == PlayState.PLAYING ? PlayStateExpanded.PLAYING
: PlayStateExpanded.PAUSED);
}
public Observable<PlayStateExpanded> playState() {
return mSubject.hide();
}
}
void onCreate(SavedinstanceState state) {
AtomicBoolean firstTime = new AtomicBoolean(true); // note first time
mPlayStateManager.playState()
.subscribe(state -> {
switch(state) {
case PlayStateExpanded.PLAYING:
showPlayingState(true, firstTime.get());
break;
case PlayStateExpanded.PAUSED:
showPlayingState(true, firstTime.get());
break;
}
firstTime.set(false); // no longer first time
}
}
所谓具有UNKNOWN
值重新定义播放状态,开机状态下被简化。只需在第一次使用后添加第一次转换标志即可完成您陈述的目标。
是的,但主题可以开始空,没有缓存的值 – urSus
而且?你的问题没有描述这种情况下的行为。代码显示您等待要定义的值。 –
你是什么意思? behaviourrelay没有初始默认值,可能是空的,那么在订阅时,这些队伍不会被缓存,并且第一个“新鲜”排放将被错误地对待。顺便说一句,这取决于它的行为继续,你不应该知道的事实,因此hide(),有没有我的方式,我可以编码它发射的数据呢? – urSus