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

Is there RxJava equivalent of Handler.postDelayed(Runnable r, long delayMillis)

我正在尝试调用一个 returns 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 特定代码 class. 我更希望它是一个冷的 Observable,因为我不必订阅它,只需调用该方法一次。

如果你不想在你的管道中发出任何东西,我不明白使用管道的意义,只是为了使用延迟?

无论如何,你想要实现的是没有意义的,你不能创建一个不发射任何东西的 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

您可以通过 defer, delay and 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();

保罗版本的测试代码:

    @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

简单使用

subscription = Observable.timer(1000, TimeUnit.MILLISECONDS)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(aLong -> whatToDo());

private void whatToDo() {
   System.out.println("Called after 1 second");
}

如果您的帖子与 Ui 相关,那么

Completable.complete()
            .delay(100, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .doOnComplete(() -> tabLayout.getTabAt(selectableTab).select())
            .subscribe();