retrofit源码相关

2020-04-26  本文已影响0人  相忘师

一,retrofit相关

    1,ConverterFactory(对返回的数据类型进行转换),目前常用GsonConverterFactory来将返回的json字符串转换为实体类,也可自定义转换为其他类型。

具体内容转换是在OkHttpCall中的parseResponse()方法实现的,该方法内部调用了serviceMethod.toResponse(catchingBody),最终通过Converter转化为所需类型。

    2,CallAdapterFactory(转换Call对象)该转换器其实比较难以理解,主要目的是把真实的OkHttpCall对象转换为接口定义里的Call对象,可以认为其实做的是一个包装对象的转换,因为Call

对象本身就可以认为是一个包装对象。可以参考两个类。

    (1)CallAdapter ,该类是将传入的OkHttpCall转换为了Cal类对象,这是官方的默认实现,可能较难理解,但是可以看另一个类

    (2)RxJava2CallAdapter,在该类中,是先把OkHttpCall对象转换成了Observable对象,然后根据具体的返回类型返回相应的Rx相关消息发送对象。

    以上这些是对于返回结果的处理,但是,本人有一个疑问,那就是触发请求的流程是什么,在哪里。

    我们知道retrofit只负责组装,所以,具体的请求是交给了retrofit内部的OkHttpCall,该类持有okhttp的call引用,所有请求是通过它来执行的,所以,我们可以看看OkHttpCall的请求方法

是在哪里调用的,我们通过代码检索,发现OkHttpCall里面的enqueue在CallEnqueueObservable这个类中进行了调用,这个类是继承Observable的一个类,而enqueue方法其实是在subscribeActual,

也就是该类subscribe的时候被调用,而再检索CallEnqueueObservable这个类时,发现最终逻辑,在RxJava2CallAdapter类中,adapter方法里面定义的responseObservable是一个新的CallEnqueueObservable对象

(异步请求),所以,流程就相当清晰了,这就是为什么我们的rx结合retrofit的请求必须在subscribe之后才会有效了,因为源CallEnqueueObservable就是在subscribe的时候调用OkHttpCall的请求方法,

至此,从请求到回调的整个逻辑就连接起来了,至于为什么adapt方法是关键,原因就在于retrofit#create方法里面的最后一行serviceMethod.adapt(okHttpCall),传入一个组装好的OkHttpCall,重复

上述流程。

二,Type

1,基本类型Class(可以认为基本和泛型无关)

2,参数化类型ParameterizedType(含有泛型(非泛型数组)皆是此类型,如List<String>,Map<K,V>,Set<T>,Class<?>)

3,数组类型GenericArrayType(带有泛型的数组,如List[],Map[])

4,WildcardType(带上下限的泛型,该种类型首先是ParameterizedType类型,当调用ParameterizedType类型的getActualTypeArguments()方法后,得到的就是WildcardType类型)

5,泛型变量TypeVariable(比如我们定义一个泛型类TestReflect<T>,并在类中定义方法oneMethod(T para),那么当调用method.getGenericParameterTypes()方法得到的Type数组,数组的元素就是由TypeVariable接口实现的)

上一篇下一篇

猜你喜欢

热点阅读