я использую BehaviourRelay в качестве наблюдаемого источника, мне нравится, что он выдает последнее кешированное значение при подписке, поэтому мне не нужно вручную вызывать showPlayingState(mPlayStateManager.getCurrentState()).
Однако это создает проблему, когда я хочу отреагировать анимацией при подписке, поскольку я не хочу запускать анимацию при этом кэшированном излучении, которое генерируется при подписке в onCreate, пользовательский интерфейс должен просто перейти в состояние, а не анимировать его. Анимация должна запускаться только в случае "свежего" выброса
Это довольно распространенный вариант использования, по крайней мере, для меня, но мне трудно понять это в 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();
}
}