Ich benutze ein BehaviourRelay als Quelle beobachtbar, ich mag, dass es den letzten zwischengespeicherten Wert beim Abonnement ausgibt, so dass ich nicht manuell den showPlayingState aufrufen muss (mPlayStateManager.getCurrentState()).Wie kann man wissen, ob die beobachtbare Emission ein zwischengespeicherter BehaviourSubject-Wert war?
Allerdings stellt dies ein Problem, wenn ich mit einer Animation in subscribe reagieren möchte, da ich keine Animation auf diese zwischengespeicherte emittieren möchte, die beim Anmelden in onCreate gesendet wird, UI sollte einfach in den Zustand nicht animieren springen zu ihm. Animation sollte nur im Fall eines „frischen“ emittieren
Dies ist ein ziemlich häufiger Anwendungsfall atleast für mich laufen, aber ich bin Mühe, es in rx herauszufinden
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();
}
}
ja, aber Betreff kann leer beginnen, ohne den zwischengespeicherten Wert – urSus
Und? Deine Frage hat das Verhalten in einem solchen Fall nicht beschrieben. Der Code zeigte, dass Sie darauf gewartet haben, dass der Wert definiert wurde. –
was meinst du? behaviorrelayhat keinen initialen Standardwert, thereforce kann leer sein, reforce wird bei der subskribierung nicht zwischengespeichert ausgegeben und erste "frische" emit werden als solche falsch behandelt. BTW das ist abhängig von der Tatsache, dass es eine Verhaltensrelay, die Sie nicht wissen sollten, daher die hide(), gibt es wie ich es in den emittierten Daten vielleicht kodieren kann? – urSus