retrofit源码相关

一,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接口实现的)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容