はい、両方の呼び出しを削除できます。
subscribeOn
と の両方を自動的にスケジュールしてobservedOn
、各呼び出しでボイラープレート呼び出しの必要性をなくすレトロフィット アダプター クラスを次に示します。
public class RxThreadingCallAdapterFactory extends CallAdapter.Factory {
private final RxJava2CallAdapterFactory original;
private RxThreadingCallAdapterFactory() {
// Always call on background thread
original = RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io());
}
public static CallAdapter.Factory create() {
return new RxThreadingCallAdapterFactory();
}
@Override
public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
return new RxCallAdapterWrapper(original.get(returnType, annotations, retrofit));
}
private static class RxCallAdapterWrapper implements CallAdapter<Observable<?>> {
private final CallAdapter<?> wrapped;
public RxCallAdapterWrapper(CallAdapter<?> wrapped) {
this.wrapped = wrapped;
}
@Override
public Type responseType() {
return wrapped.responseType();
}
@Override
public <R> Observable<?> adapt(Call<R> call) {
Observable observable = (Observable) wrapped.adapt(call);
// Always handle result on main thread
return observable.observeOn(AndroidSchedulers.mainThread());
}
}
}
次に、レトロフィットを構成するときにこのアダプターを使用します。
Retrofit.Builder()
.baseUrl(...)
.addCallAdapterFactory(RxThreadingCallAdapterFactory.create())
私は、ここで何が起こっているのかを詳しく説明するこのブログ投稿を書きました。
これにより、ボイラープレートと見なされる両方の呼び出しが削除されます。バックグラウンド呼び出しを連鎖させる Jake のシナリオは実際には当てはまらないと考えています。この場合、同期呼び出しを後付けし、スケジューラをまったく使用しないためです。