我正在尝试调用返回void(Java原始类型)的方法。我想延迟调用一个预定义的毫秒数。我知道这可以使用Handler
完成,我宁愿不使用它。
我试着这样做:
Observable.just(getView().setAttachments(attachments)).delay(50, TimeUnit.MILLISECONDS);
但是,有一个编译错误:
Observable.just(java.lang.Void) cannot be applied to (void)
还有其他方法吗?我不想使用Handler
的原因是代码是在Presenter(MVP模式)中定义的,我不想在仅Java类中使用Android特定代码。
我更喜欢它是一个冷的Observable,因为我不必订阅它,只调用该方法一次。
答案 0 :(得分:27)
您可以使用defer,delay和doOnNext实现这一目标。
Observable.defer(() -> Observable.just(null)
.delay(3, TimeUnit.SECONDS))
.doOnNext(ignore -> LogUtils.d("You action goes here"))
.subscribe();
在RxJava 2中,您可以使用以下内容:
Completable.complete()
.delay(3, TimeUnit.SECONDS)
.doOnComplete(() -> System.out.println("Time to complete " + (System.currentTimeMillis() - start)))
.subscribe();
Paul的版本测试代码:
@Test
public void testTimeToDoOnSubscribeExecution() {
final long startTime = System.currentTimeMillis();
System.out.println("Starting at: " + startTime);
Subscription subscription = Observable.empty()
.doOnSubscribe(() -> System.out.println("Time to invoke onSubscribe: " + (System.currentTimeMillis() - startTime)))
.delay(1000, TimeUnit.MILLISECONDS)
.subscribe();
new TestSubscriber((rx.Observer) subscription).awaitTerminalEvent(2, TimeUnit.SECONDS);
}
输出:
Starting at: 1467280697232
Time to invoke onSubscribe: 122
答案 1 :(得分:1)
如果您不想在管道中发出任何内容,我不会看到使用管道的问题,只是为了使用延迟?。
无论如何,你想要实现的东西没有意义,你不能创建一个不会发出任何东西的Observable。
但是如果你想要使用它,你总是可以使用像doOnSubscribe这样的运算符
@Test
public void observableDoOnSubscribe() {
Observable.empty()
.delay(50, TimeUnit.MILLISECONDS
.doOnSubscribe(() -> getView().setAttachments(attachments))
.subscribe();
}
测试延迟是否有效
boolean onSubscribe = false;
@Test
public void observableDoOnSubscribe() {
Subscription subscription = Observable.just(System.currentTimeMillis())
.doOnSubscribe(() -> onSubscribe = true)
.delay(1000, TimeUnit.MILLISECONDS)
.filter(s -> onSubscribe)
.subscribe(t-> System.out.println("Pipeline spend time:" + (System.currentTimeMillis()-t)));
new TestSubscriber((Observer) subscription)
.awaitTerminalEvent(2, TimeUnit.SECONDS);
}
此处有更多反应性示例https://github.com/politrons/reactive
答案 2 :(得分:0)
如果你的线程与Ui有关,那么
Completable.complete()
.delay(100, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.doOnComplete(() -> tabLayout.getTabAt(selectableTab).select())
.subscribe();