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

时间:2017-02-08 19:32:04

标签: android rx-java

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

  

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

这是我使用Handler的工作代码

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

Rx java代码 - 它无法正常工作

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

7 个答案:

答案 0 :(得分:64)

我就是这样做的:

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

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

答案 1 :(得分:36)

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

其次,Observable.empty()创建一个只传播结束/处置消息的Observable,它既不会doOnNext()也不会触发map()。您可以使用Observable.just()来解决此问题,但更常用的方法是使用Observable.timer()

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

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

修改:如果您关心getTransactionDetails()的结果,这当然是。如果没有,请参阅克莱德的回答。

答案 2 :(得分:12)

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

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

答案 3 :(得分:9)

它不起作用,因为delay()需要发布一些内容,但empty()实际上什么都不发布。

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

答案 4 :(得分:1)

试试这个

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

答案 5 :(得分:0)

如果您希望可与视图一起使用的一次性物品,请使用“完整物品” Completable返回一个Object,该对象在源Completables之一终止(正常情况下或有错误)并取消所有其他Completables时终止。

例如:

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

如果您想完成一项服务,我建议您订阅

例如:

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

答案 6 :(得分:0)

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

getTransactionDetails().delaySubscription(5000, TimeUnit.MILLISECONDS)