Retrofit2.0的使用之自定义CallAdapter.Factory
来源:互联网 发布:如何提升淘宝转化率 编辑:程序博客网 时间:2024/06/05 03:06
上一篇说到自定义Converter.Factory,那么很显然的在开发中我们也可能需要自定义CallAdapter,以实现我们的需求。例如:我们想要获取响应头信息进行某些操作,当然你可以你可以使用Response< T >或Result< T >作为响应实体类,但是如果我们这么写的话,那么在每个响应结果回调的地方都需要处理响应头,显然这是很麻烦的。因此,我们可以在CallAdapter里统一处理我们的响应头信息。
- 创建自定义的适配器工厂继承自CallAdapter.Factory;
- 创建自定义的适配器继承自CallAdapter< T >;
- 创建自定义的回调处理类CustomCall< R >。
一、创建适配器工厂
class MyCallAdapterFactory extends CallAdapter.Factory { //这里写步骤2、3的内容和一些必要的初始化 参考RxJavaCallAdapter //这个决定了你将采取什么样的CallAdapter @Override public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) { //获取returnType的原始类型 如 CustomCall<R> Class<?> rawType = getRawType(returnType); //返回值的类型必须是CustomCall<> 并且带有泛型 if (rawType == CustomCall.class && returnType instanceof ParameterizedType) { //获取returnType泛型的类型 如Call<MovieDataBean>中的MovieDataBean Type callReturnType = getParameterUpperBound(0, (ParameterizedType) returnType); //使用CustomCallAdapter转换处理数据 return new CustomCallAdapter(callReturnType); } else { return null; } }}
代码中的注释已经比较清晰了,不做赘述;想了解更多的请参考RxJavaCallAdapter的源码。上面代码,提到了new CustomCallAdapter(callReturnType)这就是我们的自定义CallAdapter了,下面来一段示例代码意思一下。
二、自定义的CallAdapter
/***其实这个类也是啥也没写 最终还是由CustomCall完成的*/ class CustomCallAdapter implements CallAdapter<CustomCall<?>> { private final Type responseType; // 下面的 responseType 方法需要数据的类型 CustomCallAdapter(Type responseType) { this.responseType = responseType; } @Override public Type responseType() { return responseType; } @Override public <R> CustomCall<?> adapt(Call<R> call) { //由我们自定义的CustomCall<> 处理数据 return new CustomCall<>(call); } }
CustomCall< R > 才是真正处理数据的类
//这个类只做一个大致流程的实例 没有什么实际意义class CustomCall<R> { public final Call<R> call; public CustomCall(Call<R> call) { this.call = call; } // 提供一个同步获取数据的方法 public R get() throws IOException { return call.execute().body(); } }
这个自定义就差不多了。
下面再来一个参考RxJavaCallAdapter创建的一个CallAdapterFactory:
public final class MyRxCallAdapter extends CallAdapter.Factory public static MyRxCallAdapter create() { return new MyRxCallAdapter(null); } public static MyRxCallAdapter createWithScheduler(Scheduler scheduler) { if (scheduler == null) throw new NullPointerException("scheduler == null"); return new MyRxCallAdapter(scheduler); } private final Scheduler scheduler; private MyRxCallAdapter(Scheduler scheduler) { this.scheduler = scheduler; } //获取不同的CallAdapter @Override public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) { //获取returnType的原始类型 Class<?> rawType = getRawType(returnType); //获取类名 String canonicalName = rawType.getCanonicalName(); //是否是以下两种类型 boolean isSingle = "rx.Single".equals(canonicalName); boolean isCompletable = "rx.Completable".equals(canonicalName); if (rawType != Observable.class && !isSingle && !isCompletable) { return null; } if (!isCompletable && !(returnType instanceof ParameterizedType)) { String name = isSingle ? "Single" : "Observable"; throw new IllegalStateException(name + " return type must be parameterized" + " as " + name + "<Foo> or " + name + "<? extends Foo>"); } if (isCompletable) { // Add Completable-converter wrapper from a separate class. This defers classloading such that // regular Observable operation can be leveraged without relying on this unstable RxJava API. // Note that this has to be done separately since Completable doesn't have a parametrized // type.// return CompletableHelper.createCallAdapter(scheduler); } CallAdapter<Observable<?>> callAdapter = getCallAdapter(returnType, scheduler); if (isSingle) { // Add Single-converter wrapper from a separate class. This defers classloading such that // regular Observable operation can be leveraged without relying on this unstable RxJava API.// return SingleHelper.makeSingle(callAdapter); } return callAdapter; } private CallAdapter<Observable<?>> getCallAdapter(Type returnType, Scheduler scheduler) { //获取returnType的 泛型参数类型 ParameterizedType-->>泛型 Type observableType = getParameterUpperBound(0, (ParameterizedType) returnType); //获取observableType的原始类的类型 Class<?> rawObservableType = getRawType(observableType); //返回值是Response<T> 使用ResponseCallAdapter //我们使用Response<T> 作为返回类型 Observable<Response<T>> //Response 把Headers、code等一些响应数据放到response里一起返回到我们的回调里(xxSubscriber) if (rawObservableType == Response.class) { //毋庸置疑 必须是泛型类型 if (!(observableType instanceof ParameterizedType)) { throw new IllegalStateException("Response must be parameterized" + " as Response<Foo> or Response<? extends Foo>"); } //获取observableType的泛型参数的类型 Type responseType = getParameterUpperBound(0, (ParameterizedType) observableType); return new ResponseCallAdapter(responseType, scheduler); } //返回值是 Result<T> 使用ResultCallAdapter //我们使用Result<T> 作为返回类型 Observable<Result<T>> //Result 包含了Response中的所有信息,额外还有error信息 if (rawObservableType == Result.class) { if (!(observableType instanceof ParameterizedType)) { throw new IllegalStateException("Result must be parameterized" + " as Result<Foo> or Result<? extends Foo>"); } Type responseType = getParameterUpperBound(0, (ParameterizedType) observableType); return new ResultCallAdapter(responseType, scheduler); } //返回值是普通的Object 使用SimpleCallAdapter Observable<T>、Observable<HttpResult<T>>.... //(我们的自定义CallAdapter)其实在SimpleCallAdapter中 还是将Response<HttpResult<T>>转换成了HttpResult<T> 在我们的回调里移除了Response包含的信息 //在原RxJavaCallAdapter中使用 OperatorMapResponseToBodyOrError 把原Response<T> 转换成我们自己声明的类型或错误异常类型 return new SimpleCallAdapter(observableType, scheduler); } //结果回调 在这里定义了回调流程 onNext() onError()(如果有异常则 onError() 然后return) onComplete(); static final class CallOnSubscribe<T> implements Observable.OnSubscribe<Response<T>> { private final Call<T> originalCall; CallOnSubscribe(Call<T> originalCall) { this.originalCall = originalCall; } @Override public void call(final Subscriber<? super Response<T>> subscriber) { // Since Call is a one-shot type, clone it for each new subscriber. final Call<T> call = originalCall.clone(); // Attempt to cancel the call if it is still in-flight on unsubscription. subscriber.add(Subscriptions.create(new Action0() { @Override public void call() { call.cancel(); } })); try { Response<T> response = call.execute(); if (!subscriber.isUnsubscribed()) { subscriber.onNext(response); } } catch (Throwable t) { Exceptions.throwIfFatal(t); if (!subscriber.isUnsubscribed()) { subscriber.onError(t); } return; } if (!subscriber.isUnsubscribed()) { subscriber.onCompleted(); } } } static final class ResponseCallAdapter implements CallAdapter<Observable<?>> { private final Type responseType; private final Scheduler scheduler; ResponseCallAdapter(Type responseType, Scheduler scheduler) { this.responseType = responseType; this.scheduler = scheduler; } @Override public Type responseType() { return responseType; } @Override public <R> Observable<Response<R>> adapt(Call<R> call) { Observable<Response<R>> observable = Observable.create(new CallOnSubscribe<>(call)); if (scheduler != null) { return observable.subscribeOn(scheduler); } return observable; } } static final class SimpleCallAdapter implements CallAdapter<Observable<?>> { private final Type responseType; private final Scheduler scheduler; SimpleCallAdapter(Type responseType, Scheduler scheduler) { this.responseType = responseType; this.scheduler = scheduler; } @Override public Type responseType() { return responseType; } @Override public <R> Observable<R> adapt(Call<R> call) { Observable<R> observable = Observable.create(new CallOnSubscribe<>(call)) .flatMap(new Func1<Response<R>, Observable<R>>(){ @Override public Observable<R> call(Response<R> rResponse) { //在这里可以获取响应头信息统一处理处理你的逻辑 return null; } }); if (scheduler != null) { return observable.subscribeOn(scheduler); } return observable; } } static final class ResultCallAdapter implements CallAdapter<Observable<?>> { private final Type responseType; private final Scheduler scheduler; ResultCallAdapter(Type responseType, Scheduler scheduler) { this.responseType = responseType; this.scheduler = scheduler; } @Override public Type responseType() { return responseType; } @Override public <R> Observable<Result<R>> adapt(Call<R> call) { Observable<Result<R>> observable = Observable.create(new CallOnSubscribe<>(call)) // .map(new Func1<Response<R>, Result<R>>() { @Override public Result<R> call(Response<R> response) { return Result.response(response); } }).onErrorReturn(new Func1<Throwable, Result<R>>() { @Override public Result<R> call(Throwable throwable) { return Result.error(throwable); } }); if (scheduler != null) { return observable.subscribeOn(scheduler); } return observable; } }}
代码中已经有了很多注释了,我也懒得讲了。这个地方我主要用的是SimpleCallAdapter。
阅读全文
1 0
- Retrofit2.0的使用之自定义CallAdapter.Factory
- Retrofit2学习番外——自定义Converter与CallAdapter
- Retrofit2自定义Converter.Factory
- Retrofit2.0的使用
- Retrofit2.0 的使用
- Retrofit2.0的使用
- Retrofit2.0的使用
- Retrofit2.0的使用之添加请求头
- Retrofit2.0的Converter使用
- Retrofit2.0 的初步使用
- retrofit2.0的简单使用
- Retrofit2.0的简单使用
- Retrofit2.0的使用总结
- Retrofit2.0的使用详解
- Retrofit2.0的简单使用
- Retrofit2.0的基本使用
- Retrofit2.0的简单使用
- Android学习笔记之Retrofit2的使用
- 爬去淘宝青岛啤酒的信息
- bzoj 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富(DP)
- scala之class、singleton object
- JD笔试
- usb的设置
- Retrofit2.0的使用之自定义CallAdapter.Factory
- python Day6
- HTML-css样式的创建
- [leetcode]591. Tag Validator
- C# DataTable 和List之间相互转换的方法
- 求相反数。
- Hadoop权威指南笔记③(HBase、ZooKeeper、Sqoop)
- hdu 5916 Harmonic Value Description 最大公约数
- hibernate 配置文件加载异常,解决日志