如何从Runnable创建Observable?

时间:2017-05-25 11:27:10

标签: java rx-java rx-java2

有时我想在Runnable序列中触发Observable,但Runnable不会报告进度。

我写了一个简单的工厂,用于将Runnable对象包装到Observable中:

public static <T> Observable<T> fromRunnable(final Runnable action) {
    if (action == null) {
        throw new NullPointerException("action");
    }
    return Observable.fromPublisher(subscriber -> {
        try {
            action.run();
            subscriber.onComplete();
        } catch (final Throwable throwable) {
            subscriber.onError(throwable);
        }
    });
}

用法:

Observable.concat(
    someTask, 
    MoreObservables.fromRunnable(() -> {
        System.out.println("Done. ");
    }));

但RxJava 2是否已提供此功能?

1 个答案:

答案 0 :(得分:4)

Observable没有此类工厂方法,但 Completable可以来自Runnable。因此,您可以先创建Completable,然后将其转换为Observable

Observable.concat(
    someTask, 
    Completable.fromRunnable(() -> {
        System.out.println("Done");
    }).toObservable()
);

更新:处理例外

Completable.fromRunnable在内部捕获其Runnable的异常,并将其作为onError排放推送到流中。但是,如果您使用的是Java,则必须自己处理run()方法中的已检查异常。为避免这种情况,您可以使用Callable代替Runnable,因为其call()方法的签名声明它可以抛出异常。 Completable.fromCallable()也将例外包含在onError排放中:

Observable.concat(
    someTask, 
    Completable.fromCallable(() -> {
        System.out.println("Done");
        return null;
    }).toObservable()
);

此外,Callable可用于创建单个项目排放的ObservableSingle

P.S。查看源代码,这些方法非常简单。

P.P.S。 Kotlin没有经过检查的例外;)

更新2

还有fromAction工厂方法用于创建Completable。它接受Action个对象。

  

类似于Runnable的功能接口,但允许抛出已检查的异常。

因此代码可以简化为:

Observable.concat(
    someTask, 
    Completable.fromAction(() -> {
        System.out.println("Done");
    }).toObservable()
);