Observable.fromCallable()
非常适合将单个函数转换为Observable。但是,如何处理函数可能抛出的已检查异常?
我见过的大多数例子都使用lambdas和“just work”。但是如果没有lambda,你会怎么做?例如,请参阅以下this great article:
中的引用Observable.fromCallable(() -> downloadFileFromNetwork());
现在是单线游戏!它处理已检查的异常,没有更奇怪的Observable.just()和Observable.error()这样简单的事情就像推迟代码执行一样!
当我尝试在没有lambda表达式的情况下实现上述Observable时,基于我见过的其他示例,以及Android Studio如何自动完成,我得到以下内容:
Observable.fromCallable(new Func0<File>() {
@Override
public File call() {
return downloadFileFromNetwork();
}
}
但如果downloadFileFromNetwork()
抛出一个已检查的异常,我必须尝试捕获它并将其包装在RuntimeException
中。必须有更好的方法!上面的lambda如何支持这个?!?!
答案 0 :(得分:22)
使用Func0
而不是将Observable.fromCallable()
与Callable
一起使用。例如:
Observable.fromCallable(new Callable<File>() {
@Override
public File call() throws Exception {
return downloadFileFromNetwork();
}
}
由于Callable
的方法call()
抛出Exception
,因此您不必将函数包装在try-catch中!这必须是lambda在引擎盖下使用的东西。
答案 1 :(得分:3)
您也可以这样做以返回已检查的例外:
return Observable.fromCallable(() -> {
sharedPreferences.edit()
.putString(DB_COMPANY, LoganSquare.serialize(
CompanyDBTransformation.get(user.getCompany())
))
.apply();
return user;
}).onErrorResumeNext(
throwable -> Observable.error(new CompanySerializationException(throwable))
);
所以这里我正在序列化承担IOException风险,并且我正在回馈更具描述性的描述。