Saya menggunakan BehaviourRelay sebagai sumber yang dapat diamati, saya suka itu akan mengeluarkan nilai cache terakhir saat berlangganan, jadi saya tidak perlu memanggil showPlayingState(mPlayStateManager.getCurrentState()) secara manual.
Namun hal ini menimbulkan masalah ketika saya ingin bereaksi dengan animasi dalam berlangganan, karena saya tidak ingin menjalankan animasi pada emisi yang di-cache ini, yang dipancarkan ketika saya berlangganan di onCreate, UI seharusnya melompat ke keadaan bukan menganimasikannya. Animasi harus dijalankan hanya jika terjadi emisi "segar".
Setidaknya ini adalah kasus penggunaan yang cukup umum bagi saya, tetapi saya kesulitan memahaminya di 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();
}
}