1. 功能介紹
1.1 Retrofit
Retrofit 是 Github 上面 squre 組織開發(fā)的一個(gè)類型安全的 Http 客戶端句携,它可以在 Java 和 Android 上面使用考廉。Retrofit 將描述請(qǐng)求的接口轉(zhuǎn)換為對(duì)象,然后再由該對(duì)象去請(qǐng)求后臺(tái)彼宠。Retrofit 將請(qǐng)求對(duì)象化了。目前已經(jīng)發(fā)布了 2.0beta 版本。
1.2 特點(diǎn)
Retrofit 主要有以下功能特點(diǎn)
- 將 Http 請(qǐng)求對(duì)象化杠袱,函數(shù)化昵济。讓接口的函數(shù)代表具體請(qǐng)求智绸。
- 利用注解的方式標(biāo)記參數(shù)野揪,將 HTTP 的請(qǐng)求方法,請(qǐng)求頭传于,請(qǐng)求參數(shù)囱挑,請(qǐng)求體等等都用注解的方式標(biāo)記,使用起來非常方便沼溜。
- 支持 Multipart平挑,以及文件上傳(file upload)。
- 直接將 Http 的 Response 轉(zhuǎn)換成對(duì)象系草。用戶可以根據(jù) Response 的具體內(nèi)容通熄,更換轉(zhuǎn)換器,或者自己新建轉(zhuǎn)化器找都。
- Retrofit 默認(rèn)使用 OkHttp 開源庫請(qǐng)求后臺(tái)唇辨,用戶也可以使用自定義的具體請(qǐng)求方式。方便擴(kuò)展能耻。
- 自帶提供了異步處理 Http 請(qǐng)求的方式赏枚。
1.3 簡單 Demo
這是一個(gè)簡單的例子,訪問httpbin網(wǎng)站晓猛。也可以看完整的Retrofit Demo 首先聲明一個(gè) java 接口
使用方式
使用 httpbinService 獲取一個(gè) Call饿幅,用來請(qǐng)求 HTTP 服務(wù)器。
因?yàn)榻涌诜祷氐膽?yīng)該是一個(gè) Call戒职,用來請(qǐng)求后臺(tái) HTPP 服務(wù)器栗恩,所以我們?cè)诼暶鹘涌诘乃坪酰祷貐?shù)應(yīng)該是 Call<?>洪燥。由于 httpbin 返回的是一個(gè) json 格式的數(shù)據(jù)磕秤,我們想要返回直接的自定義的模型數(shù)據(jù),但是 retrofit 默認(rèn)只會(huì)返回 ResponseBody捧韵,所以我們需要自己添加一個(gè) GsonConverter 第三方庫市咆。在 build.graddle 中的 dependencies 添加:
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
2. 總體設(shè)計(jì)
Retrofit 可以分為注解解析(Request 生成),請(qǐng)求執(zhí)行纫版,請(qǐng)求回調(diào)(異步處理)床绪,響應(yīng)體轉(zhuǎn)化幾個(gè)部分。其中請(qǐng)求執(zhí)行與請(qǐng)求回調(diào)可以算作一個(gè)部分其弊,并且請(qǐng)求回調(diào)也可以沒有癞己,Call 有直接執(zhí)行的接口 execute。
- 首先由解析部分(這部分也是 Request 生成部分)梭伐,利用注解(Annotation)解析接口文件痹雅,將接口方法解析好,每個(gè)方法生成一個(gè) Request糊识。
- 然后利用 Call 部分執(zhí)行 Request绩社。Retrofit 使用的是 okHttp 來請(qǐng)求摔蓝,程序中將 Retrofit Request 轉(zhuǎn)化為 OKHttp 開源庫的 Request,轉(zhuǎn)由 OkHttpClient 執(zhí)行愉耙。
- 在 Request 執(zhí)行完后贮尉,得到 Response,使用 Converter 轉(zhuǎn)化 Response 為用戶需要的對(duì)象朴沿。比如將 json 格式的數(shù)據(jù)猜谚,利用 gson 轉(zhuǎn)化為具體的 Object(也就是接口函數(shù)中的返回 Call 的模版參數(shù)的具體類型對(duì)象)
- 利用回調(diào)將第三步得到的對(duì)象,將對(duì)象傳回給 UI 線程赌渣,更新 UI魏铅。
這里面第三部與第四步是可以合在一起的,但是目前 Retrofit 提供的默認(rèn)代碼中坚芜,會(huì)通過 Call览芳,加入 Callback,用戶可以在 Callback 中處理結(jié)果鸿竖。
注解(Annotation)是 Retrofit 預(yù)先定義的注解沧竟,包括 Http 的各個(gè)部分,比如 POST缚忧、GET屯仗、Query、QueryMap搔谴、Field 等等。
3. 流程圖
其中生成 Call 的部分可以看下面關(guān)于這個(gè)適配器的類圖桩撮。
4. 詳細(xì)設(shè)計(jì)
4.1 類圖
首先是整個(gè)項(xiàng)目的類圖對(duì)于 Retrofit 項(xiàng)目中 CallAdapter 用著適配器模式也挺巧的敦第,通過適配器將 Callback 回調(diào)接口運(yùn)行在 UI 線程。下面時(shí)有關(guān) CallAdapter店量,Call芜果,Callback 的類圖,其中也是連續(xù)用了兩次代理模式融师。
ExecutorCallback 代理的是用戶自定義的 Callback右钾。通過這種方式讓 OkHttpCall 去執(zhí)行 Call,讓 ExecutorCallback 將用戶自定義的 Callback 運(yùn)行在指定線程上旱爆。
4.2 類功能詳細(xì)介紹
在 Retrofit 開源庫中舀射,Retrofit 類是用戶最基礎(chǔ)的訪問入口。然后 Converter 部分是由用戶自己擴(kuò)展的怀伦,而 Paraser 部分的相關(guān)類 RequestBuilder脆烟,RequestFactory 等則主要是負(fù)責(zé)解析接口并且生成 Request,而 Call房待,CallAdapter 等主要是負(fù)責(zé)底層的 Http 請(qǐng)求邢羔,以及請(qǐng)求后線程轉(zhuǎn)換驼抹。
4.2.1 Retrofit
Retrofit 類是包含了一個(gè)構(gòu)造器 Retrofit.Builder,由 Builder 指定 Retrofit 的相關(guān)參數(shù)拜鹤,創(chuàng)建一個(gè)新的 Retrofit框冀。Retrofit 中包含了很多重要的成員變量,而這些成員變量都是可以自設(shè)置的敏簿。
Retrofit 包含以下成員變量:
- baseUrl: Http 請(qǐng)求的基礎(chǔ) url明也,類型是 BaseUrl,包含了 url 函數(shù)返回 HttpUrl(OkHttp 的類)极谊,由 Retrofit.Builder.baseUrl 設(shè)置诡右。
- client:OkHttp 庫的 OkHttpClient 類型。由 Builder 的 client 函數(shù)設(shè)置轻猖,默認(rèn)為
OkHttpClient()
帆吻。 - methodHandlerCache:Map 類型,MethodHandler 的緩存咙边,從接口中解析出來猜煮,放在這個(gè) map 里面。
- converterFactories:List 類型败许,包含了很多 converter 的創(chuàng)建工廠王带,用戶可以通過 Builder 的 addConverterFactory 來添加。默認(rèn)添加了 BuiltInConverters市殷。
- callbackExecutor:回調(diào)函數(shù)的執(zhí)行器愕撰,也就是回調(diào)函數(shù)執(zhí)行的線程,Android 中默認(rèn)為 MainThreadExecutor醋寝。
- adapterFactories:List 類型搞挣,包含了 CallAdapter.Factory,用戶可以通過 Builder 的 addCallAdapterFactory 來添加音羞。Android 中默認(rèn)添加了 ExecutorCallAdapterFactory囱桨。使用 callbackExecutor 作為 Executor。
- validateEagerly:這個(gè)是設(shè)置的在創(chuàng)建動(dòng)態(tài)代理對(duì)象之前嗅绰,是否提前解析接口 Method舍肠,創(chuàng)建 MethodHandler 并添加到 Cache 中。
Retrofit 重要方法:
- create(final Class service):T 這個(gè)是一個(gè) public 模版方法窘面,用戶可以通過這個(gè)方法翠语,傳入接口 Class(T),獲得接口 Class Http 請(qǐng)求的動(dòng)態(tài)代理對(duì)象财边。這是該開源庫的主入口啡专,這個(gè)函數(shù)先驗(yàn)證接口以及其方法,然后創(chuàng)建一個(gè)匿名 InvocationHandler制圈,在匿名 InvocationHandler 的 invoke 中首先去掉 Object 以及 Platform 默認(rèn)的方法们童,然后調(diào)用 loadMethodHandler 解析對(duì)應(yīng)的方法(接口方法)畔况,創(chuàng)建 MethodHandler 加入到 methodHandlerCache 中,得到 MethodHandler慧库,最后調(diào)用 MethodHandler 的 invoke 方法得到返回結(jié)果(接口方法的返回類型)跷跪。動(dòng)態(tài)代理請(qǐng)見Java 動(dòng)態(tài)代理
- loadMethodHandler(Method method):MethodHandler<?> 解析對(duì)應(yīng)的方法(接口方法),創(chuàng)建 MethodHandler 加入到 methodHandlerCache 中齐板,返回得到 MethodHandler吵瞻。
- nextCallAdapter(CallAdapter.Factory skipPast, Type returnType, Annotation[] annotations):CallAdapter<?> 該方法主要是從 callAdapterFactories 中獲取新的 CallAdapter,它會(huì)跳過 skipPast甘磨,以及 skipPast 之前的 Factory橡羞,然后找到與 returnType 和 annotations 都匹配的 CallAdapterFactory。如果不匹配 CallAdapterFactory 的 get 會(huì)返回 null济舆,所以搜索 Factories 的時(shí)候卿泽,直到搜索到返回非 null 就找到對(duì)應(yīng)的了。
如果沒有找到對(duì)應(yīng)的 CallAdapterFactories滋觉,得到 CallAdapter签夭,則該方法會(huì)拋出一個(gè) IllegalArgumentException 異常,異常里面的 message 會(huì)是"Could not locate call adapter for "椎侠,如果遇到這個(gè)異常第租,則去判斷對(duì)應(yīng)的方法的返回類型是不是與 CallAdapterFactory 不匹配。
- requestConverter(Type type, Annotation[] annotations):Converter<T, RequestBody> 也是模版方法我纪,該方法返回 Converter慎宾。利用 converterFactories 創(chuàng)建一個(gè)與 RequestBody 對(duì)應(yīng)的 Converter 對(duì)象。 如果沒有找到對(duì)應(yīng)的 ConverterFactory浅悉,得到 Converter璧诵,則該方法會(huì)拋出一個(gè) IllegalArgumentException 異常,異常里面的 message 會(huì)是"Could not locate RequestBody converter for "仇冯。同樣,如果遇到這個(gè)異常族操,則去判斷對(duì)應(yīng)的方法的返回類型是不是與 ConverterFactory 不匹配苛坚。
- responseConverter(Type type, Annotation[] annotations): Converter<ResponseBody, T> 與 requestConverter 類似,不過該方法對(duì)應(yīng)的是 Response色难。
4.2.2 MethodHandler
MethodHandler 是 retrofit 中連接了解析部分泼舱,執(zhí)行部分,轉(zhuǎn)換部分的一個(gè)關(guān)鍵的中間類枷莉。不過 MethodHandler 的代碼量很少娇昙。它可以說是連接各個(gè)部分的橋梁,也是接口方法的描述類笤妙。它有包含了 retrofit冒掌,requestFactory噪裕,callAdapter,responseConverter 成員變量股毫。主要方法如下
- create(Retrofit retrofit, Method method):MethodHandler<?> 這是個(gè)靜態(tài)方法膳音。MethodHandler 的創(chuàng)建方法,在這個(gè)方法里面通過創(chuàng)建 CallAdapter铃诬,responseConverter祭陷,requestFactory,最后創(chuàng)建 MethodHandler趣席。
- createCallAdapter(Method method, Retrofit retrofit): CallAdapter<?> 這是個(gè)靜態(tài)方法兵志。通過 retrofit 的 newCallAdapter 創(chuàng)建 CallAdapter
- createResponseConverter(Method method,Retrofit retrofit, Type responseType):Converter<ResponseBody, ?> 這是個(gè)靜態(tài)方法。通過 retrofit 的 responseConverter 方法得到 responseConverter
- invoke(Object... args):Object 通過 callAdapter 的 adapter 將 OkHttpCall 轉(zhuǎn)換成需要返回的 Call
4.2.3 Converter 與 Converter.Factory
這兩個(gè)類別都是在 Converter 文件下宣肚。Converter 是接口想罕,F(xiàn)actory 抽象類,很簡短钉寝。
Factory 主要是負(fù)責(zé)生成兩種 Converter弧呐。Retrofit 實(shí)現(xiàn)了一個(gè)簡單的 BuiltInConverters。
4.2.4 Call
這是 Retrofit 的框架基礎(chǔ)接口嵌纲。它是 Retrofit 的發(fā)送請(qǐng)求給服務(wù)器并且返回響應(yīng)體的調(diào)用俘枫。每個(gè) Call 都有自己的 HTTP 請(qǐng)求和相匹配的響應(yīng)。 它有如下四個(gè)接口:
- execute 同步執(zhí)行請(qǐng)求
Response<T> execute() throws IOException;
- enquene 異步執(zhí)行請(qǐng)求逮走,并且使用 Callback 作為請(qǐng)求結(jié)束后的回調(diào)鸠蚪。
void enqueue(Callback<T> callback);
- cancel 取消請(qǐng)求
void cancel();
- clone 復(fù)制請(qǐng)求,如果需要很多相同的 Call师溅,可以通過 clone 復(fù)制茅信。
Call<T> clone();
4.2.5 CallAdapter
這是 Retrofit 的框架基礎(chǔ)接口。CallAdapter 是將一個(gè) Call 適配給另外一個(gè) Call 的適配器接口墓臭。它有以下兩個(gè)接口:
- responseType 返回請(qǐng)求后蘸鲸,轉(zhuǎn)化的參數(shù) Type 類型。
Type responseType();
- adapt 適配窿锉,將一個(gè) Call 轉(zhuǎn)換成另外一個(gè) Call酌摇。
<R> T adapt(Call<R> call);
4.2.6 Callback
請(qǐng)求結(jié)構(gòu)的回調(diào)接口。在 Call 的 enquene 接口中使用 有如下兩個(gè)方法
- onResponse 返回響應(yīng)體
void onResponse(Response<T> response, Retrofit retrofit);
- onFailure 請(qǐng)求失敗的時(shí)候嗡载,比如網(wǎng)絡(luò)或者一些難以預(yù)料的異常窑多。
void onFailure(Throwable t);
4.2.7 OkHttpCall
實(shí)現(xiàn)了 Call 接口,但同樣是模版類洼滚。首先介紹一下 OkHttpCall 的主要函數(shù):
- createRawCall
private com.squareup.okhttp.Call createRawCall()
根據(jù)由 requestFactory 根據(jù) args 創(chuàng)建一個(gè) Request埂息,然后利用這個(gè) Request 創(chuàng)建一個(gè) okhttp.Call。
- parseResponse
private Response<T> parseResponse(com.squareup.okhttp.Response rawResponse) throws IOException
解析 okhttp.Response,
- 首先將 body 讀取出來作為 rawBody千康,然后用 OkHttpCall.NoContentResponseBody 作為新的 Body享幽,創(chuàng)建新的 rawResponse。
- 判斷 Response.code()吧秕,如果不在 200 范圍內(nèi)琉闪,讀取 rawBody 出來,返回一個(gè)錯(cuò)誤的 retrofit 的 Response砸彬。如果 code 為 204 或 205(沒有返回內(nèi)容)颠毙,則返回一個(gè) body 為空的 retrofit 的 Response。
- 如果 code 正常砂碉,則用 OkHttpCall.ExceptionCatchingRequestBody 包裝一下 rawBody蛀蜜, 然后使用 responseConverter 將包裝后的 catchingBody 轉(zhuǎn)化為具體的返回類型數(shù)據(jù)。
OkHttpCall 是將 Request 放入到 okhttp 的 Call 里面執(zhí)行增蹭,執(zhí)行完成后滴某,又將 okhttp 的 Call 返回的 Response 轉(zhuǎn)化為 retrofit 的 Response,在此同時(shí)將 Body 里面的內(nèi)容滋迈,通過 converter 轉(zhuǎn)化為對(duì)應(yīng)的對(duì)象霎奢。這個(gè) OkHttpCall
4.2.8 Response
這個(gè)類是包含了具體返回對(duì)象的響應(yīng)體。里面包含了模版參數(shù) T 類型的 body 對(duì)象饼灿,以及 okhttp 的 Response幕侠。
4.2.9 注解類
在 Retrofit 里面創(chuàng)建了 Body 注解,F(xiàn)iled 注解(Field碍彭,F(xiàn)ieldMap)晤硕,請(qǐng)求方法注解(DELETE,GET庇忌,PATCH舞箍,POST,PUT)皆疹,請(qǐng)求頭注解(HEAD疏橄,Header,Headers)略就,multipart 注解(Part捎迫,Multipart,PartMap)残制,接口加碼(FormUrlEncoded),Url掖疮,Streaming初茶,查詢(Query,QueryMap),參數(shù)路徑(Path)恼布,HTTP
4.2.10 RequestBuilderAction
這是一個(gè)抽象類螺戳,只有一個(gè)未實(shí)現(xiàn)的 perform 方法。
abstract void perform(RequestBuilder builder, Object value);
但是在 RequestBuilderAction 類里面有很多 RequestBuilderAction 的子類折汞,分別對(duì)應(yīng)注解類倔幼。Url,Header爽待,Path损同,Query,QueryMap鸟款,F(xiàn)ield膏燃,F(xiàn)ieldMap,Part何什,PartMap组哩,Body 都是在 RequestBuilderAction 的內(nèi)部類,并且繼承了 RequestBuilderAction处渣。RequestBuilder 就是將對(duì)應(yīng)注解的值給 RequestBuilder伶贰。
4.2.11 RequestBuilder
這是一個(gè) okhttp.Request 的創(chuàng)建類。負(fù)責(zé)設(shè)置 HTTP 請(qǐng)求的相關(guān)信息罐栈,創(chuàng)建 Request黍衙。它主要有以下方法:
- RequestBuilder
- setRelativeUrl
- addHeader
- addPathParam
- canonicalize static 方法
- canonicalize
- addQueryParam
- addFormField
- addPart
- setBody
- build
它的構(gòu)造方法如下: RequestBuilder(String method, HttpUrl baseUrl, String relativeUrl, Headers headers, MediaType contentType, boolean hasBody, boolean isFormEncoded, boolean isMultipart)
RequestBuilder 就是創(chuàng)建請(qǐng)求。
4.2.12 RequestFactory
RequestFactory 是創(chuàng)建 Request悠瞬,他有個(gè) create 方法们豌,
Request create(Object... args) {
參數(shù)是接口函數(shù)對(duì)應(yīng)的參數(shù)值,cerate 是創(chuàng)建 RequestBuilder浅妆,遍歷 RequestFactory 的成員變量 requestBuilderActions望迎,設(shè)置好 RequestBuilder,最后創(chuàng)建 Request 返回凌外。
4.2.13 RequestFactoryParser
這個(gè)類主要是接口函數(shù) Method 的每個(gè)注解辩尊。入口函數(shù)是 parse。
先解析方法注解(應(yīng)用到方法上的注解)康辑,比如說 FormUrlEncoded摄欲,Headers。得到對(duì)應(yīng)的值疮薇。
然后再解析方法參數(shù)注解(應(yīng)用到方法參數(shù)上的注解)胸墙,在解析方法參數(shù)注解的時(shí)候,會(huì)生成一個(gè) requestBuilderActions 數(shù)組按咒,對(duì)應(yīng)到每個(gè)參數(shù)迟隅。每個(gè) Action 都對(duì)應(yīng)了每個(gè)函數(shù)參數(shù)的處理。等到具體函數(shù)調(diào)用的時(shí)候,跟函數(shù)具體的參數(shù)值對(duì)應(yīng)智袭。也就是 RequestFactory 與 Builder 的工作了奔缠,這部分是等到運(yùn)行的時(shí)候才能夠確定的。
4.2.14 BuiltInConverters吼野,OkHttpResponseBodyConverter校哎,VoidConverter,OkHttpRequestBodyConverter
BuiltInConverters 繼承自 Converter.Factory瞳步,返回的 responseConverter 是 OkHttpResponseBodyConverter 或 VoidConverter闷哆,也就是接口方法返回的職能是 OkHttp 的 ResponseBody,或者 Void谚攒。 返回的 requestConverter 是 OkHttpRequestBodyConverter阳准,接口方法的參數(shù)中如果使用 Body,那 Body 也只能是 OkHttp 的 RequestBody馏臭。
VoidConverter: 將 OkHttp 的 ResponseBody 轉(zhuǎn)化為 Void野蝇。 OkHttpResponseBodyConverter:將 OkHttp 的 ResponseBody 轉(zhuǎn)化為 OkHttp 的 ResponseBody。如果是 Streaming 標(biāo)記的接口的話括儒,利用 Utils.readBodyToBytesIfNecessary 緩沖整個(gè) body绕沈。 OkHttpRequestBodyConverter:將 OkHttp 的 RequestBody 轉(zhuǎn)化為 OkHttp 的 RequestBody。
4.2.15 PlatForm.Android.MainThreadExecutor
一個(gè) Executor帮寻,通過 android Handler 將 Runnable 執(zhí)行在 UI 線程中乍狐。
4.2.16 Utils
這是 Retrofit 中的一個(gè)工具類,里面包含了很多范型的檢查固逗、操作浅蚪。另外以及一些基本的工具性的功能。下面是它里面的函數(shù):
checkNotNull
<T> T checkNotNull(T object, String message)
檢查非空烫罩,如果是 null惜傲,則拋出 NullPointerException,內(nèi)容提示為 message贝攒。closeQuietly
static void closeQuietly(Closeable closeable)
靜默地關(guān)閉 Closeable 對(duì)象盗誊。不會(huì)拋出異常isAnnotationPresent
static boolean isAnnotationPresent(Annotation[] annotations,Class<? extends Annotation> cls)
判斷 cls 是否是 annotations 里面的一個(gè)實(shí)例。如果在則返回 true隘弊。readBodyToBytesIfNecessary
static ResponseBody readBodyToBytesIfNecessary(final ResponseBody body) throws IOException
如果 body 非 null 的話哈踱,把整個(gè) body 讀取出來(讀取到 buffer),返回再返回一個(gè) ResponseBody。validateServiceInterface
static <T> void validateServiceInterface(Class<T> service)
驗(yàn)證接口是否有效,這個(gè)接口就是用戶自定義的接口哗咆。如果不是接口,或者里面沒有任何函數(shù)邪财,則拋出 IllegalArgumentException 異常舅列。getSingleParameterUpperBound
public static Type getSingleParameterUpperBound(ParameterizedType type)
該函數(shù)獲取 type 的單個(gè)模版參數(shù)的上屆。如果 type 有多個(gè)類型卧蜓,函數(shù)會(huì)拋出異常,如果模版參數(shù)不是 WildcardType把敞,則直接返回模版參數(shù)類型hasUnresolvableType
public static boolean hasUnresolvableType(Type type)
判斷是否有不能分解的類型弥奸,比如有 TypeVariable,WildcardType 等getRawType
public static Class<?> getRawType(Type type)
這個(gè)方法是從 Gson 里面截取的奋早,獲取 type 的實(shí)際類型盛霎。methodError
static RuntimeException methodError(Method method, String message, Object... args)
static RuntimeException methodError(Throwable cause, Method method, String message,Object... args)
兩個(gè)重載函數(shù),拋出方法錯(cuò)誤異常getCallResponseType
static Type getCallResponseType(Type returnType)
獲取返回 Call 的返回類型耽装,必須是模版參數(shù)類型愤炸,并且 Call 的模版參數(shù)不能是 retrofit.Response.class。返回 getSingleParameterUpperBound(returnType)
4.3 擴(kuò)展
Retrofit 是很適合擴(kuò)展的掉奄,里面設(shè)計(jì)的 Call规个,以及 Converter 就是為了方便擴(kuò)展使用。
4.3.1 Converter
Retrofit 提供的默認(rèn)的 Converter 只會(huì)返回 ResponseBody姓建,如果我們想要返回具體的 Object诞仓,我們可以使用另外的第三方包,并且在創(chuàng)建 Retrofit 的時(shí)候添加對(duì)應(yīng)的 ConverterFactory速兔。這里有 6 個(gè)序列化第三方庫:
- Gson: com.squareup.retrofit:converter-gson
- Jackson: com.squareup.retrofit:converter-jackson
- Moshi: com.squareup.retrofit:converter-moshi
- Protobuf: com.squareup.retrofit:converter-protobuf
- Wire: com.squareup.retrofit:converter-wire
- Simple XML: com.squareup.retrofit:converter-simplexml
4.3.2 Rxjava
retrofit 也可以與Rxjava聯(lián)合起來使用墅拭,之前的版本使用范例可以參考http://randomdotnext.com/retrofit-rxjava/
- adapter-Rxjava: com.squareup.retrofit:adapter-rxjava
正在開發(fā)中,主要是通過擴(kuò)展 CallAdapter涣狗,將之前 Call谍婉,轉(zhuǎn)換為 rxjava 需要的 Observable<?>。
5 說明
這篇文章不是我寫的镀钓,本文補(bǔ)全了好多我之前對(duì)Retrofit的遺漏知識(shí)穗熬,所以復(fù)制粘貼下來當(dāng)作筆記,如果其他同學(xué)看到掸宛,還請(qǐng)多看原作者的原文章:https://github.com/android-cn/android-open-project-analysis/tree/master/tool-lib/network/retrofit死陆。