我试图将我的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();
答案 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)