一缴阎,retrofit相關(guān)
? ? 1酒觅,ConverterFactory(對(duì)返回的數(shù)據(jù)類(lèi)型進(jìn)行轉(zhuǎn)換)躯枢,目前常用GsonConverterFactory來(lái)將返回的json字符串轉(zhuǎn)換為實(shí)體類(lèi)话肖,也可自定義轉(zhuǎn)換為其他類(lèi)型。
具體內(nèi)容轉(zhuǎn)換是在OkHttpCall中的parseResponse()方法實(shí)現(xiàn)的蜡峰,該方法內(nèi)部調(diào)用了serviceMethod.toResponse(catchingBody)了袁,最終通過(guò)Converter轉(zhuǎn)化為所需類(lèi)型。
? ? 2湿颅,CallAdapterFactory(轉(zhuǎn)換Call對(duì)象)該轉(zhuǎn)換器其實(shí)比較難以理解载绿,主要目的是把真實(shí)的OkHttpCall對(duì)象轉(zhuǎn)換為接口定義里的Call對(duì)象,可以認(rèn)為其實(shí)做的是一個(gè)包裝對(duì)象的轉(zhuǎn)換油航,因?yàn)镃all
對(duì)象本身就可以認(rèn)為是一個(gè)包裝對(duì)象崭庸。可以參考兩個(gè)類(lèi)谊囚。
? ? (1)CallAdapter 冀自,該類(lèi)是將傳入的OkHttpCall轉(zhuǎn)換為了Cal類(lèi)對(duì)象,這是官方的默認(rèn)實(shí)現(xiàn)秒啦,可能較難理解,但是可以看另一個(gè)類(lèi)
? ? (2)RxJava2CallAdapter搀玖,在該類(lèi)中余境,是先把OkHttpCall對(duì)象轉(zhuǎn)換成了Observable對(duì)象,然后根據(jù)具體的返回類(lèi)型返回相應(yīng)的Rx相關(guān)消息發(fā)送對(duì)象灌诅。
? ? 以上這些是對(duì)于返回結(jié)果的處理芳来,但是,本人有一個(gè)疑問(wèn)猜拾,那就是觸發(fā)請(qǐng)求的流程是什么即舌,在哪里。
? ? 我們知道retrofit只負(fù)責(zé)組裝挎袜,所以顽聂,具體的請(qǐng)求是交給了retrofit內(nèi)部的OkHttpCall肥惭,該類(lèi)持有okhttp的call引用,所有請(qǐng)求是通過(guò)它來(lái)執(zhí)行的紊搪,所以蜜葱,我們可以看看OkHttpCall的請(qǐng)求方法
是在哪里調(diào)用的,我們通過(guò)代碼檢索耀石,發(fā)現(xiàn)OkHttpCall里面的enqueue在CallEnqueueObservable這個(gè)類(lèi)中進(jìn)行了調(diào)用牵囤,這個(gè)類(lèi)是繼承Observable的一個(gè)類(lèi),而enqueue方法其實(shí)是在subscribeActual滞伟,
也就是該類(lèi)subscribe的時(shí)候被調(diào)用揭鳞,而再檢索CallEnqueueObservable這個(gè)類(lèi)時(shí),發(fā)現(xiàn)最終邏輯梆奈,在RxJava2CallAdapter類(lèi)中野崇,adapter方法里面定義的responseObservable是一個(gè)新的CallEnqueueObservable對(duì)象
(異步請(qǐng)求),所以鉴裹,流程就相當(dāng)清晰了舞骆,這就是為什么我們的rx結(jié)合retrofit的請(qǐng)求必須在subscribe之后才會(huì)有效了,因?yàn)樵碈allEnqueueObservable就是在subscribe的時(shí)候調(diào)用OkHttpCall的請(qǐng)求方法径荔,
至此督禽,從請(qǐng)求到回調(diào)的整個(gè)邏輯就連接起來(lái)了,至于為什么adapt方法是關(guān)鍵总处,原因就在于retrofit#create方法里面的最后一行serviceMethod.adapt(okHttpCall)狈惫,傳入一個(gè)組裝好的OkHttpCall,重復(fù)
上述流程鹦马。
二胧谈,Type
1,基本類(lèi)型Class(可以認(rèn)為基本和泛型無(wú)關(guān))
2荸频,參數(shù)化類(lèi)型ParameterizedType(含有泛型(非泛型數(shù)組)皆是此類(lèi)型菱肖,如List<String>,Map<K,V>,Set<T>,Class<?>)
3,數(shù)組類(lèi)型GenericArrayType(帶有泛型的數(shù)組旭从,如List[]稳强,Map[])
4,WildcardType(帶上下限的泛型和悦,該種類(lèi)型首先是ParameterizedType類(lèi)型退疫,當(dāng)調(diào)用ParameterizedType類(lèi)型的getActualTypeArguments()方法后,得到的就是WildcardType類(lèi)型)
5鸽素,泛型變量TypeVariable(比如我們定義一個(gè)泛型類(lèi)TestReflect<T>褒繁,并在類(lèi)中定義方法oneMethod(T para),那么當(dāng)調(diào)用method.getGenericParameterTypes()方法得到的Type數(shù)組馍忽,數(shù)組的元素就是由TypeVariable接口實(shí)現(xiàn)的)