web-dev-qa-db-ja.com

チェックされた例外でObservable.fromCallable()を使用する方法?

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でラップする必要があります。より良い方法があるはずです!上記のラムダはこれをどのようにサポートしますか?!?!

11
ashughes

_Func0_をObservable.fromCallable()とともに使用するのではなく、Callableを使用します。例えば:

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

Callableのメソッドcall()Exceptionをスローするため、関数をtry-catchでラップする必要はありません。これはラムダが内部で使用しているものでなければなりません。

23
ashughes

これを実行して、チェックされた例外を返すこともできます。

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リスクをとってシリアライズし、より説明的な説明を返しています。

3
cesards