Retrofit
Retrofit是Android开发常用的网络请求框架,打算简单看一下源码,看看调用api的时候,都执行了什么
Retrofit.Builder().xxxx.build()
构建Retrofit对象,初始化一些属性
retrofit.create(clazz)
根据传递的class类型,一般是接口,构建接口的动态代理实现类。动态代理使得调用接口的任何一个方法的时候,都将走到代理对象invoke方法
动态代理对象做了什么
ServiceMethod serviceMethod = Retrofit.this.loadServiceMethod(method);
Retrofit中维护一个map,变量名是serviceMethodCache,缓存接口函数。
这个代码从缓存中读取函数,如果有,就读取,没有就缓存起来
OkHttpCall okHttpCall = new OkHttpCall(serviceMethod, args);
构建了一个OkHttpCall对象,这个对象是对请求事件的封装,有request功能,enqueue功能,execute功能,解析返回结果的功能等
return serviceMethod.callAdapter.adapt(okHttpCall);
适配了一下okHttpCall,okHttpCall是被适配者
当我们调用retrofitServer.getxxx()的时候,就执行了动态代理方法,返回了适配后的Call对象
call.execute() 执行了okhttp的execute
OkHttpCall层
execute方法:
createRawCall()
使用传递的参数构建Request对象。
ParameterHandler解析注解等参数
使用Request对象构建了一个RealCall对象,返回
return this.parseResponse(call.execute());
再看call.execute方法
call.execute()方法中,
调用okhttpClient执行请求。okhttpClient维护一个分发器,用于将任务分发到线程池中的线程中
Response result = this.getResponseWithInterceptorChain();
添加拦截器,包括为Client设置的拦截器,成为拦截器链,然后
Interceptor.Chain chain = new RealInterceptorChain(interceptors, (StreamAllocation)null, (HttpCodec)null, (Connection)null, 0, this.originalRequest);
return chain.proceed(this.originalRequest);
调用到RealInterceptorChain.proceed方法
这个方法中,逐个调用interceptor.intercept(next)方法处理请求。相当于将处理的结果逐层传递下去,还要拦截返回结果【带有返回结果的责任链模式】
实际处理网络请求的拦截器
查看最后添加的拦截器为CallServerInterceptor。实际处理了网络请求,包括
HttpCodec httpCodec = ((RealInterceptorChain)chain).httpStream();
StreamAllocation streamAllocation = ((RealInterceptorChain)chain).streamAllocation();
这两行代码,内部构建了RealConnection对象,通过RealConnection对象建立socket连接
RealConnection
这个类是实现构建socket连接,传递参数,读取结果的实际连接类
拦截器
因为Retrofit的拦截器是一个带有返回结果的责任链模式,所以在拦截器的intercept方法中,我们可以拦截到请求和响应