Я ищу, чтобы создать класс LocationHandler, который возвращает observable<Location>
, я могу отправить новое местоположение и подписчики получить последнее добавленное и любые последующие значения.RX Java 2, Observable, который принимает новые значения, которые необходимо добавить
Я написал этот класс, он работает, но я не знаю, правильно ли это сделать, потому что я добавил обратный вызов, и я плохо его чувствую.
Спасибо за любую помощь.
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 совет, который я изменил его с 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);
}
}
На самом деле я не могу использовать поведение, потому что это поток я получаю через LocationInitializationBuilder.build. Поведение требует определенной ценности, которую я не могу обеспечить при создании. –
Да, я вижу, где проблема. Ваше решение выглядит законным. –
'BehaviourSubject' имеет статический метод' create', который создает пустой 'BehaviourSubject' – Blackbelt