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