如何使用带有已检查异常的Observable.fromCallable()?

时间:2016-03-24 19:17:44

标签: java android rx-java reactive-programming

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如何支持这个?!?!

2 个答案:

答案 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风险,并且我正在回馈更具描述性的描述。