ashughes ashughes - 29 days ago 15
Java Question

How to use Observable.fromCallable() with a checked Exception?

Observable.fromCallable()
is great for converting a single function into an Observable. But how do you handle checked exceptions that might be thrown by the function?

Most of the examples I've seen use lambdas and "just work". But how would you do this without lambdas? For example, see the quote below from this great article:

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



It's a one-liner now! It deals with checked exceptions, no more weird Observable.just() and Observable.error() for such easy thing as deferring code execution!


When I attempt to implement the above Observable without a lambda expression, based on other examples I've seen, and how Android Studio auto-completes, I get the following:

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


But if
downloadFileFromNetwork()
throws a checked exception, I have to try-catch it and wrap it in a
RuntimeException
. There's got to be a better way! How does the above lambda support this?!?!

Answer

Rather than using a Func0 with Observable.fromCallable(), use Callable. For example:

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

Since Callable's method call() throws Exception, you don't have to wrap your function in a try-catch! This must be what the lambda is using under the hood.

Comments