RxJavaCallAdapterFactory

881 阅读1分钟

最近项目使用RxJava和Retrofit搭配做网络请求。有一段代码经常重复:

Sevice.XXX()
	.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
	.subscribe();

RxJavaCallAdapterFactory添加异步调度代码:

public final class RxJava2CallAdapterFactory extends CallAdapter.Factory {

    public static RxJava2CallAdapterFactory create() {
        return new RxJava2CallAdapterFactory();
    }
    private retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory mFactory;

    private RxJava2CallAdapterFactory() {
        this.mFactory = retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory.create();
    }
    @Override
    public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
        final CallAdapter<?, ?> callAdapter = mFactory.get(returnType, annotations, retrofit);
        if (null == callAdapter) {
            return null;
        } else {
            CallAdapter<Observable<?>, Observable<?>> adapter = (CallAdapter<Observable<?>, Observable<?>>) callAdapter;
            return new KunCallAdapter(adapter);
        }
    }
    final class KunCallAdapter implements CallAdapter<Observable<?>, Observable<?>> {
        private CallAdapter<Observable<?>, Observable<?>> mAdapter;

        KunCallAdapter(CallAdapter<Observable<?>, Observable<?>> adapter) {
            this.mAdapter = adapter;
        }
        @Override
        public Type responseType() {
            return mAdapter.responseType();
        }
        @Override
        public Observable<?> adapt(Call<Observable<?>> call) {
            return mAdapter.adapt(call).subscribeOn(Schedulers.io())
                    .subscribeOn(Schedulers.newThread())
                    .observeOn(AndroidSchedulers.mainThread());
        }
    }
}

添加自定义RxJava2CallAdapterFactory之后省略了异步调度代码:

Sevice.XXX().subscribe();