Observable.fromCallable()
は、単一の関数をObservableに変換するのに最適です。しかし、関数によってスローされる可能性があるチェック済み例外をどのように処理しますか?
私が見たほとんどの例は、ラムダと「ただ働く」ことを使用しています。しかし、ラムダなしでこれをどのように行いますか?たとえば、以下の引用を参照してください この素晴らしい記事 :
_Observable.fromCallable(() -> downloadFileFromNetwork());
_
ワンライナーになりました!チェックされた例外を扱い、コードの実行を延期するなどの簡単なことのために、奇妙なObservable.just()とObservable.error()はもうありません!
ラムダ式なしで上記のObservableを実装しようとすると、他の例と、Android Studioのオートコンプリートがどのようにオートコンプリートするか)に基づいて、次のようになります。
_Observable.fromCallable(new Func0<File>() {
@Override
public File call() {
return downloadFileFromNetwork();
}
}
_
しかし、downloadFileFromNetwork()
がチェック例外をスローする場合は、それをキャッチしてRuntimeException
でラップする必要があります。より良い方法があるはずです!上記のラムダはこれをどのようにサポートしますか?!?!
_Func0
_をObservable.fromCallable()
とともに使用するのではなく、Callable
を使用します。例えば:
_Observable.fromCallable(new Callable<File>() {
@Override
public File call() throws Exception {
return downloadFileFromNetwork();
}
}
_
Callable
のメソッドcall()
はException
をスローするため、関数をtry-catchでラップする必要はありません。これはラムダが内部で使用しているものでなければなりません。
これを実行して、チェックされた例外を返すこともできます。
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リスクをとってシリアライズし、より説明的な説明を返しています。