美文网首页
retrofit源码相关

retrofit源码相关

作者: 相忘师 | 来源:发表于2020-04-26 11:08 被阅读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接口实现的)

    相关文章

      网友评论

          本文标题:retrofit源码相关

          本文链接:https://www.haomeiwen.com/subject/ocgxgttx.html