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

标签 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,因为我不必订阅它,只需调用该方法一次。

最佳答案

您可以使用 defer 实现此目的, delaydoOnNext .

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

关于java - 是否有 RxJava 等效于 Handler.postDelayed(Runnable r, long delayMillis),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38118453/

相关文章:

java - 两个相互连接的日期选择器同时调用两个监听器

javascript - 如何在平板电脑和手机的 Android 设备方向更改时获得正确的窗口宽度

java - 使用多线程读取单个文件 : should speed up?

c# - 基于key的异步锁

android - 服务+安卓 :process "vs" IntentService

java - 使用Conda打包一组JARS

java - CSV 作为 XML 元素的文本节点

java - 在 Java 中管理 cookie

android - 找不到 com.google.firebase-core :17. 0.1:

android - 如何在Android应用程序中播放Youtube视频?