web-dev-qa-db-fra.com

Comment réinitialiser un BehaviorSubject

J'ai une BehaviorSubject que je voudrais réinitialiser - je veux dire par là que je veux que la dernière valeur ne soit pas disponible, comme si elle venait d'être créée.

Je ne semble pas voir une API pour faire cela, mais je suppose qu'il y a un autre moyen d'obtenir le même résultat?

Mon comportement souhaité est que je dois émettre des événements et j'aimerais que les abonnés obtiennent le dernier événement lorsqu'ils s'abonnent, si un responsable particulier est dans un état "démarré". Mais lorsque ce gestionnaire est "arrêté", le dernier événement ne doit plus être disponible (comme s'il n'avait jamais été démarré auparavant).

10
BoD

Je suppose que vous voulez effacer la BehaviorSubject (car sinon, n'appelez pas onComplete dessus). Cela n'est pas pris en charge, mais vous pouvez obtenir un effet similaire en ayant une valeur actuelle ignorée par les consommateurs:

public static final Object EMPTY = new Object();

BehaviorSubject<Object> subject = BehaviorSubject.createDefault(EMPTY);

Observable<YourType> obs = subject.filter(v -> v != EMPTY).cast(YourType.class);

obs.subscribe(System.out::println);

// send normal data
subject.onNext(1);
subject.onNext(2);

// clear the subject
subject.onNext(EMPTY);

// this should not print anything
obs.subscribe(System.out::println);
13
akarnokd

Une autre méthode pour activer et désactiver la valeur d’un observable consiste à utiliser switchMap() pour basculer entre l’observable réel et un vide.

Supposons que vous avez un objet manager et qu'il possède une observable indiquant son état. Ensuite,

subjectObservable = manager.getStateObservable()
  .switchMap( state -> state == ON ? subject : Observable.never() );

émettra des valeurs uniquement lorsque la manager est dans l'état ON.

6
Bob Dalgleish

Subject.skiplast (1) peut fonctionner pour "nettoyer" la dernière position sur le flux qui est conservée en raison du comportement "BehaviorSubject". 

0
VITROXMAN

Un problème avec @ akarnokd est que le .cast empêche YourType d'être une interface ou un type générique tel que List<String>

Une autre option consiste à filtrer sur un champ booléen que vous pouvez activer et désactiver. 

    private BehaviorSubject<PandoraApp> subject = BehaviorSubject.create();
    private boolean enabled = true;

    Observable<PandoraApp> observable = subject.filter(v -> enabled);

Si des méthodes sont appelées sur différents threads, vous pouvez utiliser AtomicBoolean pour l'indicateur de filtre.

0
miguel

Utilisez simplement setTimeout comme ceci:

setOtpoint(value) {

    this._setOption.next(value);

    // Clear BehaviorSubject after emit value

    setTimeout(() => {
      this._setOption.next(null);
    }, 100);

  }
0
Alberto Oliveira