tutorial rxkotlin rxjava2 rxjava qué métodos example español componen android rx-java

rxkotlin - ¿Cómo llamar a un método después de un retraso en Android usando rxjava?



rxjava2 android español (6)

Estoy tratando de reemplazar mi método Handler a Rx java. mi requerimiento

Quiero llamar al método getTransactionDetails () solo después de 5 segundos.

este mi código de trabajo utilizando Handler

new Handler().postDelayed(new Runnable() { @Override public void run() { getTransactionDetails(); } }, 5000);

Rx código java - no está funcionando

Observable.empty().delay(5000, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnNext(o -> getTransactionDetails()) .subscribe();


Así es como lo haría:

Completable.timer(5, TimeUnit.SECONDS, AndroidSchedulers.mainThread()) .subscribe(this::getTransactionDetails);

Un Completable representa un cálculo diferido sin valor, pero una indicación de finalización o excepción. El timer() llamada al método estático timer() devuelve un Completable que indica la finalización una vez transcurrido el período de tiempo especificado, y la llamada subscribe() significará que se llamará al método getTransactionDetails() en el objeto actual cuando se dispare el temporizador. Al proporcionar un Scheduler como último argumento a Completable.timer() usted controla qué hilo se usa para ejecutar getTransactionDetails() .


No funciona, porque el delay() necesita algo para emitirse, pero el empty() realidad no emite nada.

En su lugar, debe utilizar Observable.timer() .


Prueba esto

Observable.just(true).delay(5000, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(o -> getTransactionDetails()) .subscribe();


Si desea un desechable que se pueda usar con la vista, use un Completable Completable devuelve un Objeto que termina tan pronto como uno de los fuente Completables termina (normalmente o con un error) y cancela todos los demás.

P.ej :

Completable.timer(5, TimeUnit.SECONDS, AndroidSchedulers.mainThread()) .subscribe(() -> { // code after delay here });

Si desea que un servicio se complete, le recomendaría una suscripción

P.ej :

observable.timer(5000, TimeUnit.MILLISECONDS) .map(o -> { // your code after delay here }) .observeOn(AndroidSchedulers.mainThread()) .subscribe( ()-<{ // enter the service here } );


doOnNext() es para efectos secundarios. Podría usarse, por ejemplo, para fines de registro, porque el registro no altera el flujo de datos. Pero quieres pasar el resultado de getTransactionDetails() , por lo que deberías usar map en su lugar.

En segundo lugar, Observable.empty() crea un Observable que solo propaga el mensaje de finalización / disposición, no doOnNext() ni doOnNext() ni map() . Podría arreglar esto usando Observable.just() lugar de una manera más idiomática sería usar Observable.timer() :

Observable.timer(5000, TimeUnit.MILLISECONDS) .map(o -> getTransactionDetails()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( ... );

Una nota final sobre los programadores. Observable.timer() y delay() se ejecutan en el programador de cómputo de manera predeterminada, por lo que no necesita llamar a .subscribeOn(Schedulers.io()) para ejecutar getTransactionDetails() fuera del hilo principal. Observable.timer() y delay() podrían tomar un Scheduler como parámetro si desea controlar esto. Por lo tanto, debe llamar a .observeOn(AndroidSchedulers.mainThread()) si desea usar el resultado de getTransactionDetails() en el subproceso de la interfaz de usuario. Cada operador después de observeOn() se ejecuta en el Scheduler definido, por lo que tiene que poner observeOn() después del cálculo.

Edición : Esto es, por supuesto, si te importa el resultado de getTransactionDetails() . Si no, vea la respuesta de Clyde.


Observable .timer( 5000, TimeUnit.MILLISECONDS ) .subscribeOn(Schedulers.io()) .map(o -> getTransactionDetails() ) .subscribe();

Usted no necesita observarse porque suscribirse está vacío. usar el temporizador será la forma más correcta