是否有RxJava等效的Handler.postDelayed(Runnable r,long delayMillis)

时间:2016-06-30 09:02:06

标签: java android multithreading rx-java mvp

我正在尝试调用返回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,因为我不必订阅它,只调用该方法一次。

3 个答案:

答案 0 :(得分:27)

您可以使用deferdelaydoOnNext实现这一目标。

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();