Android记录--Retrofit代码追踪

94 阅读2分钟

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方法中,我们可以拦截到请求和响应