java - schedulers - Observable que no pasa nada en onSiguiente()
schedulers rxjava (6)
Comenzando con RxJava 2, la mejor manera de hacer esto es usar un Completable
Representa un cálculo diferido sin ningún valor, pero solo una indicación de finalización o excepción. La clase sigue un patrón de evento similar al de Reactive-Streams: onSubscribe (onError | onComplete)?
Necesitaría un Observable, por ejemplo, para proporcionar un reloj del sistema, que no necesite pasar nada en onNext (). No pude encontrar una firma que me permitiera hacer eso.
Claro, podría usar cualquier objeto y luego pasar nulo, pero eso no tiene mucho sentido. Así que mi pregunta es si hay una mejor manera de hacerlo.
Observable.create(new Observable.OnSubscribe<Anyobject>() { // use any object in the signature
@Override public void call(Subscriber<? super Anyobject> subscriber) {
subscriber.onNext(null); // then pass null
subscriber.onCompleted();
}
})
No necesita llamar al onNext
si su Observable
no emite nada. Podrías usar Void
en tu firma y hacer algo como
Observable<Void> o = Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(Subscriber<? super Void> subscriber) {
// Do the work and call onCompleted when you done,
// no need to call onNext if you have nothing to emit
subscriber.onCompleted();
}
});
o.subscribe(new OnCompletedObserver<Void>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("onError " + e.getMessage());
}
});
Puede definir un OnCompletedObserver para simplificar su devolución de llamada de Observer para que no tenga que anular el onNext ya que no lo necesita.
public abstract class OnCompletedObserver<T> implements Observer<T> {
@Override
public void onNext(T o) {
}
}
Si he entendido lo que estás preguntando, esto debería hacer el truco.
No sé si esto te ayudará o no.
El código escrito en RxSwift
.
// Create an observable and emit somethings
let myObservable = Observable<Void>.create{ observer in
observer.on(.next(Void()))
return Disposables.create()
}
// Observer subscribe changes
myObservable.subscribe(onNext: {
_ in
print("Hello")
}).disposed(by: disposeBag)
O usa el objeto Variable
// Create a Variable object that contanins nothing
var myValueWatcher:Variable<Void> = Variable<Void>(Void())
// Observer subscribe changes
myValueWatcher.asObservable().skip(1).subscribe(onNext: {
_ in
print("Changes!")
}).disposed(by: disposeBag)
// The emit code
myValueWatcher.value = Void()
Si necesita que se le pase algo a onNext()
antes de onCompleted()
:
Observable.<Void>just(null)
Si solo necesita onCompleted()
para ser llamado:
Observable.empty()
Una de las soluciones de luz es utilizar Observable<Boolean>
Y luego onNext(Boolean.TRUE)
que luego ignora.
RxJava 2.x ya no acepta valores nulos y lo siguiente producirá la excepción NullPointerException de inmediato o como una señal de flujo descendente.
...
Esto significa que
Observable<Void>
ya no puede emitir ningún valor, sino que solo termina normalmente o con una excepción. Los diseñadores de API pueden optar por definirObservable<Object>
sin garantía sobre qué Objeto será (lo que debería ser irrelevante de todos modos)
Significa que no puede usar Void
y hacer Observable.just(null)
.
Utilice Object
o algún otro tipo simple en su lugar:
Observable.just(new Object());