有时我想在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是否已提供此功能?
答案 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
可用于创建单个项目排放的Observable
或Single
。
P.S。查看源代码,这些方法非常简单。
P.P.S。 Kotlin没有经过检查的例外;)
更新2
还有fromAction
工厂方法用于创建Completable
。它接受Action
个对象。
类似于Runnable的功能接口,但允许抛出已检查的异常。
因此代码可以简化为:
Observable.concat(
someTask,
Completable.fromAction(() -> {
System.out.println("Done");
}).toObservable()
);