Retrofit源码解析---执行请求(RxJavaCallAdapterFactory)
来源:互联网 发布:好易网络电视下載 编辑:程序博客网 时间:2024/06/05 17:05
Demo改成Observable
public interface IServiceDemo { @POST("login/nameAuth") Observable<String> login( @Body User ueser);}
Observable<String> call = requestSerives.login(user);call.subscribe(new Action1<String>() { @Override public void call(String s) { System.out.println("return:" + s); } });
这里就不是enque了,要用subscribe
首先,我们看下获取callAdapter的过程
public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) { Class<?> rawType = getRawType(returnType); boolean isSingle = "rx.Single".equals(rawType.getCanonicalName()); if (rawType != Observable.class && !isSingle) { return null; } if (!(returnType instanceof ParameterizedType)) { String name = isSingle ? "Single" : "Observable"; throw new IllegalStateException(name + " return type must be parameterized" + " as " + name + "<Foo> or " + name + "<? extends Foo>"); } CallAdapter<Observable<?>> callAdapter = getCallAdapter(returnType); 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; }这里类为Observable,调用getCallAdapter根据返回值类型获取CallAdapter
private CallAdapter<Observable<?>> getCallAdapter(Type returnType) { Type observableType = getParameterUpperBound(0, (ParameterizedType) returnType); Class<?> rawObservableType = getRawType(observableType); if (rawObservableType == Response.class) { if (!(observableType instanceof ParameterizedType)) { throw new IllegalStateException("Response must be parameterized" + " as Response<Foo> or Response<? extends Foo>"); } Type responseType = getParameterUpperBound(0, (ParameterizedType) observableType); return new ResponseCallAdapter(responseType); } 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); } return new SimpleCallAdapter(observableType); }进行一系列检查之后,调用new SimpleCallAdapter获取CallAdapter
SimpleCallAdapter(Type responseType) { this.responseType = responseType; }
有前面分析可知,当我们在调用Service方法的时候,会通过代理调用invoke方法,而invoke又会调用callAdapter的adapt方法,我们看下SimpleCallAdapter的adapt
@Override public <R> Observable<R> adapt(Call<R> call) { return Observable.create(new CallOnSubscribe<>(call)) // .flatMap(new Func1<Response<R>, Observable<R>>() { @Override public Observable<R> call(Response<R> response) { if (response.isSuccess()) { return Observable.just(response.body()); } return Observable.error(new HttpException(response)); } }); }
首先创建了一个Observable,它的onSubscribe是CallOnSubscribe,然后调用flatmap对前面的输出Response进一步处理,如果成功,在调用just使用body作为参数生成一个Observable返回,否则返回Observable.error
由分析Rxjava知道,当我们调用subscribe的时候,我调用到CallOnSubscribe的call函数
@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(); } }拷贝一个原始的call,然后调用它的execute函数
@Override public Response<T> execute() throws IOException { okhttp3.Call call; synchronized (this) { if (executed) throw new IllegalStateException("Already executed."); executed = true; if (creationFailure != null) { if (creationFailure instanceof IOException) { throw (IOException) creationFailure; } else { throw (RuntimeException) creationFailure; } } call = rawCall; if (call == null) { try { call = rawCall = createRawCall(); } catch (IOException | RuntimeException e) { creationFailure = e; throw e; } } } if (canceled) { call.cancel(); } return parseResponse(call.execute()); }
这里跟我们前面分析的enque函数有点像,都是调用OkHttp去执行具体的请求
获取到请求后,调用订阅者的onNext,这里的订阅者是我们后面flatMap里面生成的MapSubscriber
他最终会调用它的map函数对请求做进一步处理,然后返回给调用者。
0 0
- Retrofit源码解析---执行请求(RxJavaCallAdapterFactory)
- Retrofit源码解析:RxJavaCallAdapterFactory
- Retrofit源码解析---执行请求(DefaultCallAdapterFactory)
- Retrofit源码解读(三)--RxJavaCallAdapterFactory讲解
- Retrofit2源码解析(三)添加 RxJavaCallAdapterFactory适配器
- 【Retrofit】Retrofit源码解析
- 【源码解读】Retrofit网络请求过程源码解析
- Retrofit源码解析
- Retrofit源码解析
- Retrofit源码解析
- Retrofit源码解析
- Retrofit源码解析
- Retrofit源码解析
- Android Retrofit源码解析
- Retrofit 源码解析
- Retrofit源码解析
- Retrofit源码解析---初始化
- Retrofit 源码解析
- 当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值
- LeetCode 62. Unique Paths
- UE4项目运行时显示鼠标指针
- leetCode_Max Sum of Rectangle No Larger Than K
- 用动态规划来优化0-1背包问题
- Retrofit源码解析---执行请求(RxJavaCallAdapterFactory)
- tomcat查看GC信息
- 教你如何免费升级XMind 8!
- LuaFramework-打包AssetBundle工具
- 递归获取目录下的所有文件
- eclipse导入项目时的常见错误
- 撸一段 SQL ? 还是撸一段代码?
- 函数指针与函数模板及函数绑定器
- 3346 数据结构实验之二叉树七:叶子问题