single schedulers rxjava programming example curso java rx-java

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

De la documentación :

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 Wiki :

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 definir Observable<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());