Je cherche à créer une classe LocationHandler qui renvoie un observable<Location>
dont je peux envoyer un nouvel emplacement et les abonnés obtiennent le dernier ajouté et toutes les valeurs suivantes.RX Java 2, Observable qui accepte de nouvelles valeurs à ajouter
J'ai écrit cette classe, cela fonctionne mais je ne sais pas si c'est la bonne façon de le faire parce que j'ai ajouté un rappel et je le sens mal.
Merci pour toute aide.
public class LocationHandler {
private MessageHandler<Location> onNewItem;
private Observable<Location> locationObservable;
public LocationHandler(LocationInitializationBuilder locationInitBuilder) {
locationObservable = getHookedObservable()
.mergeWith(locationInitBuilder.build())
.replay(1).autoConnect();
}
private Observable<Location> getHookedObservable() {
return Observable.create(new ObservableOnSubscribe<Location>() {
@Override
public void subscribe(ObservableEmitter<Location> e) throws Exception {
onNewItem = location -> e.onNext(location);
}
});
}
public Observable<Location> getLocation(){
return locationObservable;
}
public void setLocation(Location address){ // <---------- add new values
if (onNewItem != null){
onNewItem.handleMessage(address);
} else {
throw new IllegalStateException("Cannot add an item to a never subscribed stream");
}
}
}
Après des conseils @Blackbelt J'ai modifié avec un ReplaySubject.
public class LocationHandler {
private ReplaySubject<Location> inputStream = ReplaySubject.create(1);
private Observable<Location> locationObservable;
public LocationHandler(LocationInitializationBuilder locationInitBuilder) {
locationObservable = locationInitBuilder.build()
.mergeWith(inputStream)
.replay(1).autoConnect();
}
public Observable<Location> getLocation(){
return locationObservable;
}
public void setLocation(Location address){
inputStream.onNext(address);
}
}
En fait, je ne peux pas utiliser un comportement parce qu'il est un flux que je reçois via LocationInitializationBuilder.build. Un comportement a besoin d'une valeur définie que je ne peux pas fournir à la création. –
Oui, je vois où est le problème. Votre solution semble légitime. –
'BehaviourSubject' a une méthode statique' create' qui crée un 'BehaviourSubject' vide – Blackbelt