Ich bin auf der Suche nach einer LocationHandler-Klasse, die eine observable<Location>
zurückgibt, ich kann einen neuen Standort senden und Abonnenten erhalten die letzte hinzugefügt und alle nachfolgenden Werte.RX Java 2, Observable akzeptiert neue Werte zum Hinzufügen
Ich habe diese Klasse geschrieben, es funktioniert, aber ich weiß nicht, ob es der richtige Weg ist, es zu tun, weil ich einen Rückruf hinzugefügt habe und ich rieche es schlecht.
Danke für jede Hilfe.
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");
}
}
}
@Blackbelt Beratung Nach ich es mit einem ReplaySubject geändert haben.
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);
}
}
Eigentlich kann ich nicht ein Verhalten verwenden, weil es ein Bach, das ich über LocationInitializationBuilder.build bekommen. Ein Verhalten braucht einen bestimmten Wert, den ich bei der Erstellung nicht bereitstellen kann. –
Ja, ich sehe, wo das Problem liegt. Ihre Lösung sieht echt aus. –
'BehaviourSubject' hat eine statische Methode' create', die ein leeres 'BehaviourSubject' erzeugt – Blackbelt