ฉันใช้ BehaviourRelay เป็นแหล่งที่มาที่สังเกตได้ ฉันชอบที่มันจะปล่อยค่าแคชล่าสุดเมื่อสมัครสมาชิก ดังนั้นฉันจึงไม่จำเป็นต้องเรียก showPlayingState(mPlayStateManager.getCurrentState()) ด้วยตนเอง
อย่างไรก็ตาม สิ่งนี้ทำให้เกิดปัญหาเมื่อฉันต้องการตอบสนองต่อแอนิเมชันในการสมัครสมาชิก เนื่องจากฉันไม่ต้องการเรียกใช้แอนิเมชั่นตามการปล่อยแคชนี้ ซึ่งจะถูกปล่อยออกมาเมื่อฉันสมัครสมาชิกใน onCreate UI ควรข้ามไปที่สถานะ ไม่ใช่เคลื่อนไหว แอนิเมชันควรทำงานเฉพาะในกรณีที่มีการปล่อย "ใหม่" เท่านั้น
นี่เป็นกรณีการใช้งานที่ค่อนข้างธรรมดาสำหรับฉัน แต่ฉันมีปัญหาในการหามันในรูปแบบ 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();
}
}