我们先从最简单的Retrofit使用方法看
retrofit最简单的使用方法,只需要设置baseUrl 即可。接口的返回值为Call泛型类型为ResponseBody。 首先来看retrofit的build()方法。
在build方法中主要流程是 626行用户是否设置了自己的请求客户端,如果没有将使用retrofit中内置的okhttp客户端。 631行是一个回调线程切换器,内部是使用Handler将请求的结果切换到UI线程上,代码如下
之后的638行是将线程切换器包装成一个DefaultCallAdapterFactory,并放入callAdapterFactories中。 其中DefaultCallAdapterFactory是一个仅支持接口返回类型为Call,且泛型类型为确定类型的类
之后的代码是将内置的类型转换器BuiltInConverters和platform.defaultConverterFactories()放入converterFactories中。
其中BuiltInConverters只支持返回值类型为ResponseBody,Void,Unit类型
综上,我们采用最简单的retrofit配置方式,我们的返回值只能支持Call类型且泛型类型为ResponseBody,Void,Unit。
retrofit的build方法结束。
接下来进入retrofit的create方法
在create方法中,retrofit使用动态的代理的设计模式,对标记在retrofit上的所有注解进行解析饿,create方法中主要是对传入进来的.class对象进行验证。 154行表示,如果方式是Object中的方法直接运行。最后的return判断方法是否是接口实现的默认方法,如果是就直接运行,不是则进入loadServiceMethod(method)方法参数解析。
197行进行参数解析前,retrofit会对解析过的方法进行缓存,防止重复解析。进入ServiceMethod.parseAnnotations方法进行解析。
26行是对注解进行解析,代码比较简单,就是对标注的注解进行检验取值。最后构建出RequestFactory对象
经过解析和验证,retrofit此时已经拿到了所有注解的信息。最后进入HttpServiceMethod.parseAnnotations(retrofit, method, requestFactory);方法
这个方法比较长也比较重要,进入该方法后,首先会判断方法的返回值类型是否是协程,如果不是协程将直接取出返回值,并根据返回值,最终调用到CallAdapter.get()方法,确认使用注册的哪种CallAdapter
因为我们这是最简单的使用方法,返回值的类型为Call,也没有注册其他的CallAdapter,所有获取的CallAdapter就是上面DefaultCallAdapterFactory。
之后根据返回值Call传入的泛型,retrofit会寻找合适的类型转换器。
由于我们没有注册其他的类型转换器,且设置的泛型参数为ResponseBody,所有会进入默认的BuiltInConverters。
至此所有的解析工作完成,最后将要调用Retrofit的create方法中调用.invoke()方法。
invoke()方法的唯一实现类是HttpServiceMethod
invoke方法中并没有直接返回Call对象,而是使用OkHttpCall,将Call对象进行了代理这一步是为了retrofit和okhttp进行解耦。并且将返回值类型使用类型转换器转换类型。之后如果替换okhttp,只需要替换OkhttpCall对象的实现。
之后继续调用adapt(call,args)方法,由于我们并没有使用协程,所以adapt方法的实现还是在HttpServiceMethod中
前面我们已经分析了callAdapter,所以该方法中我们使用的就是DefaultCallAdapterFactory中的callAdapter
DefaultCallAdapterFactory和我们平时集成LiveDate和Rxjava的CallAdapter一样,最后返回和代理的Call对象,在调用enqueue方法后会讲线程主动切换回UI线程,在DefaultCallAdapterFactory中调用enqueue方法实际回调用okHttpCall代理的enqueue方法,该方法中会调用合适的类型转换器进行转换