如何使用Observable.fromCallable()处理已检查异常?

12

Observable.fromCallable()非常适合将单个函数转换为Observable。但是,当该函数可能抛出已检查异常时,该怎么办呢?

我看到的大多数示例都使用Lambda表达式并且“只是起作用”。但是如果没有Lambda表达式,你会怎么做呢?例如,请参见这篇优秀文章中的下面一句话:

Observable.fromCallable(() -> downloadFileFromNetwork());

现在只需要一行代码!它处理了已检查异常,不再需要使用 Observable.just() 和 Observable.error() 来简单地推迟代码执行!

当我尝试实现上述 Observable,但没有使用 lambda 表达式,基于其他示例和 Android Studio 的自动完成,我得到以下内容:

Observable.fromCallable(new Func0<File>() {
    @Override
    public File call() {
        return downloadFileFromNetwork();
    }
}

但是如果downloadFileFromNetwork()抛出一个受检异常,我必须尝试捕获它并将其包装在RuntimeException中。一定有更好的方法!上面的lambda如何支持这个?!?!


在文档http://reactivex.io/RxJava/javadoc/rx/Observable.html#fromCallable(java.util.concurrent.Callable)中使用java.util.concurrent.Callable。 - flakes
2个回答

23

使用Callable而不是Func0Observable.fromCallable()一起使用。例如:

Observable.fromCallable(new Callable<File>() {
    @Override
    public File call() throws Exception {
        return downloadFileFromNetwork();
    }
}

由于 Callable 的方法 call() 抛出 Exception,因此您不必将函数包装在 try-catch 中!这可能是 lambda 在底层使用的内容。


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的风险,并提供更具描述性的说明。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接