什么是Retrofit2
Retrofit2 可以說是目前最流行的類型安全網(wǎng)絡庫,是Square公司的一個開源項目诗芜,通過注解來創(chuàng)建restful API接口韧献。目前2.0版本已經(jīng)穩(wěn)定竣贪,下文如無特殊說明,均指2.0版本卡者。
Retrofit2使用步驟
Retrofit2的使用很簡單蒿囤,主要分為以下幾個步驟:
創(chuàng)建Interface接口,通過注解標識客戶端與后臺約定的API接口
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
創(chuàng)建Retrofit實例崇决,生成Interface的實現(xiàn)類(動態(tài)代理實現(xiàn)對象)
Retrofit retrofit = new Retrofit.Builder().baseUrl("[https://api.github.com](https://api.github.com/)").build();
GitHubService service = retrofit.create(GitHubService.class);
調用上面創(chuàng)建的實現(xiàn)類中的API請求方法材诽,取得Call對象
Call<List<Repo>> repos = service.listRepos("octocat");
根據(jù)調用場景異步或同步底挫,執(zhí)行call對象的同步或異步執(zhí)行方法,異步方法需要傳入Callback回調參數(shù)
異步:call.enqueue(Callback callback)
同步:call.execute()
Retrofit2內部原理
根據(jù)上面Retrofit2使用步驟脸侥,我們逐步來探究Retrofit內部的奧秘
第一步?jīng)]啥好說的建邓,就是根據(jù)跟服務器的接口協(xié)議文檔寫注解接口。
這里的鉤子方法為
loadMethodHandler(method).invoke(args)
我們一步步跟下去注簿,接著看loadMethodHandler方法
loadMethodHandler方法
loadMethodHandler方法就是根據(jù)method返回相應的methodHandler。MethodHandler顧名思義為方法處理器跳仿,method與MethodHandler一一對應的關系是采用map實現(xiàn)的诡渴。一個method對應一個MethodHandler,如果當前method對應handler不存在則會創(chuàng)建一個然后再put到map里面菲语。通過method獲取對應的handler后妄辩,調用handler的invoke()方法。
我們再往里面分析山上,可以看到invoke方法使用CallAdapter進行Call<R>的轉換眼耀。Call轉換工作是通過CallAdapter call適配器的adapt方法進行的。
- CallAdapter是什么佩憾?顧名思義就是Call的適配器哮伟,作用就是創(chuàng)建/轉換Call對象,把Call轉換成預期的格式妄帘。CallAdatper創(chuàng)建是通過CallAdapter.factory工廠類進行的澈吨,本身只有一個轉換方法adapt()。創(chuàng)建CallAdatper Factory需要實現(xiàn)Factory接口寄摆,接口只包含一個方法CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit); 通過傳入的returnType參數(shù)來返回相應的CallAdapter。
interface Factory {
CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit);}
DefaultCallAdapter為Retrofit2自帶默認Call轉換器修赞,用來生成OKHTTP的call請求調用婶恼。Retrofit內部維護著一個calladapterFactory列表。Retrofit會依次遍歷adapterFactory list列表來查詢并返回能夠處理對應returntype的calladapter柏副,如果一個都獲取不到勾邦,則拋出illegalArgument異常。Retrofit內置2種callAdapter割择,都只能處理返回類型為Call的調用眷篇。兩者唯一區(qū)別是Call的回調是否通過指定的Executor執(zhí)行。
- 異步/同步發(fā)起請求荔泳。請求最終生成的還是okhttp raw call蕉饼,然后再分別進行異步/同步調用虐杯。okhttp raw call的生成是通過RequestFactory來完成的。
RequestFactory生成Request方法
- 返回請求的解析昧港。服務器返回的數(shù)據(jù)格式一般為JSON/XML擎椰,采用相應的解析器ResponseConverter轉換成Class對象。ResonseConverter實現(xiàn)Converter接口创肥,Converter接口只有一個T convert(F value)方法和Factory工廠內部類达舒。用戶自定義Converter需實現(xiàn)Converter接口。Retrofit內部維護著一個ResonseConvert列表叹侄,代表retrofit解析結果的能力巩搏。Retrofit解析的時候依次從列表中取出converter嘗試做轉換,轉換成功則返回轉換Class對象趾代,如果轉換失敗贯底,繼續(xù)選取列表中下一個Converter直到最后失敗拋出IllegalArgumentException(Could not locate ResponseBody converter for **)異常。
系統(tǒng)處理Response解析稽坤,查找匹配converter方法
總結
Retrofit源代碼初步解讀就到此結束丈甸,在分析的過程中深刻感覺頂尖高手寫的代碼是多么的巧妙,需向大牛們多多學習尿褪。Retrofit2庫主要涉及到的知識點:泛型睦擂,注解。運用的設計模式:工廠模式杖玲,適配器模式顿仇,單例模式,代理模式摆马。通過適配器模式實現(xiàn)了Retrofit的插件化臼闻。