如何在使用rxjava的android延迟后调用一个方法?

Vib*_*s M 33 android rx-java

我试图将我的Handler方法替换为Rx java.我的要求

我想在5秒后调用方法getTransactionDetails().

这是我使用Handler的工作代码

new Handler().postDelayed(new Runnable() {
      @Override
      public void run() {
        getTransactionDetails();
      }
    }, 5000); 
Run Code Online (Sandbox Code Playgroud)

Rx java代码 - 它不起作用

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

Cly*_*yde 76

我就是这样做的:

    Completable.timer(5, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
        .subscribe(this::getTransactionDetails);
Run Code Online (Sandbox Code Playgroud)

Completable表示不带任何值,但是完成或异常的指示的延迟计算.静态方法调用在指定的时间段过去后timer()返回一个Completable表示完成的信号,subscribe()调用将意味着getTransactionDetails()当计时器触发时将在当前对象上调用该方法.通过提供一个Scheduler作为最后一个参数来Completable.timer()控制用于执行的线程getTransactionDetails().


Geo*_*izy 47

doOnNext()是副作用.它可以用于例如记录目的,因为日志记录不会改变数据流.但是你想传递结果getTransactionDetails(),所以你应该使用map.

其次,Observable.empty()创建一个Observable只是传播光洁度/去除消息,它既不引发doOnNext()既不map().您可以使用Observable.just()相反的方法修复此问题,但更常用的方法是使用Observable.timer():

Observable.timer(5000, TimeUnit.MILLISECONDS)
        .map(o -> getTransactionDetails())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe( ... );
Run Code Online (Sandbox Code Playgroud)

关于调度程序的最后说明.Observable.timer()并且delay()默认情况下在计算调度程序上执行,因此您无需调用在主线程外.subscribeOn(Schedulers.io())执行getTransactionDetails().Observable.timer()并且如果你想控制它,delay()可以将a Scheduler作为参数.因此,.observeOn(AndroidSchedulers.mainThread())如果要getTransactionDetails()在UI线程上使用结果,则需要调用.每个运算符observeOn()都在定义后执行Scheduler,因此您必须observeOn()在计算之后执行.

编辑:这当然是你关心的结果getTransactionDetails().如果没有,请参阅克莱德的回答.


小智 13

Observable
     .timer( 5000, TimeUnit.MILLISECONDS )
     .subscribeOn(Schedulers.io())
     .map(o -> getTransactionDetails() )
     .subscribe();
Run Code Online (Sandbox Code Playgroud)

你不需要observeOn因为订阅空了.使用计时器将是更正确的方式


xiz*_*zhu 9

它不起作用,因为delay()需要发射一些东西,但empty()实际上什么都不发出.

相反,你应该使用Observable.timer().

  • 或者`Completable.complete().延迟(...)` (4认同)

小智 7

延迟订阅已定义。您的示例可以通过以下方式实现:

getTransactionDetails().delaySubscription(5000, TimeUnit.MILLISECONDS)
Run Code Online (Sandbox Code Playgroud)