問題:
1,Retrofit具體是如何調(diào)器Okhttp進行請求的漾峡。
一痪蝇,簡介
Retrofit是對網(wǎng)絡(luò)請求進行封裝鄙陡,他是基于OKhttp的一個網(wǎng)絡(luò)封裝框架。
1躏啰,App通過Retrofit請求網(wǎng)絡(luò)趁矾,其實是通過Retrofit封裝請求參數(shù),之后由okHttp完成請求操作
2给僵,在網(wǎng)絡(luò)層返回數(shù)據(jù)后OkHttp將數(shù)據(jù)返回給Retrofit毫捣,Retrofit再根據(jù)用戶的需求進行解析。
Retrofit的的優(yōu)勢是具有很好的擴展性,支持RxJava蔓同,GSON饶辙,OkHttp進行無縫對接。
二牌柄,Retrofit的使用
1畸悬,官網(wǎng)的例子
2,CGLIB代理模式:可以改字節(jié)碼珊佣。
三,Retrofit源碼
Retrofit的優(yōu)勢是通過大量的設(shè)計模式對網(wǎng)絡(luò)請求進行了解耦披粟。
1咒锻,網(wǎng)絡(luò)通信八步
1.創(chuàng)建Retrofit實例
2.定義一個網(wǎng)路請求接口,并未接口中的方法添加注解守屉。
3.通過動態(tài)代理生成網(wǎng)絡(luò)請求對象惑艇。
4.通過網(wǎng)絡(luò)請求適配器將網(wǎng)絡(luò)請求對象進行平臺適配。
5.通過網(wǎng)絡(luò)請求執(zhí)行器發(fā)送網(wǎng)絡(luò)請求拇泛。
6.通過數(shù)據(jù)轉(zhuǎn)換器解析數(shù)據(jù)滨巴。
7.通過回調(diào)執(zhí)行器切換線程。
8.用戶在主線程處理結(jié)果
2俺叭,Retrofit七個成員變量
1.private final Map<Method, ServiceMethod<?, ?>> serviceMethodCache = new ConcurrentHashMap<>();
2.final okhttp3.Call.Factory callFactory;
3.final HttpUrl baseUrl;
4.final List<Converter.Factory> converterFactories;
5.final List<CallAdapter.Factory> callAdapterFactories;
6.final @Nullable Executor callbackExecutor;
7.final boolean validateEagerly;
3恭取,builder構(gòu)建者模式&Builder內(nèi)部類
private final Platform platform;
private @Nullable okhttp3.Call.Factory callFactory;
private HttpUrl baseUrl;
private final List<Converter.Factory> converterFactories = new ArrayList<>();
private final List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>();
private @Nullable Executor callbackExecutor;
private boolean validateEagerly;
4,創(chuàng)建ConvertFactory加入到Retrofit的ConvertFactory集合中
5熄守,創(chuàng)建CallAdapterFactory加入到Retrofit的CallAdapterFactory集合中
實現(xiàn)CallAdapterFactory的步奏
實現(xiàn)Factory--->注冊CallAdapter--->Factory.get()--->adapt方法蜈垮。
6,通過builder的build方法創(chuàng)建Retrofit對象裕照。
7攒发,創(chuàng)建網(wǎng)絡(luò)請求接口實例。
(1) 網(wǎng)絡(luò)接口中的方法裝換成serviceMethod對象晋南。
(2)獲取OkHttpCall
8惠猿,同步異步請求。
同步:Okhttp.excute()
異步:Okhttp.enqueue()
四负间,Retrofit中用到的設(shè)計模式
1偶妖,Builder構(gòu)建者模式(1,方便擴展穿入?yún)?shù)唉擂。2餐屎,方便把實現(xiàn)和表示相分離。)
2玩祟,工廠模式腹缩,靜態(tài)工廠(工廠模式就是通過一個工廠類去創(chuàng)建某個類的對象。)
3,代理模式(不直接去調(diào)用某個類的方法藏鹊,而是中間設(shè)置一個代理類润讥,讓這個代理類穿搭調(diào)用的意圖)
4,外觀模式(影藏內(nèi)部各個子系統(tǒng)盘寡,對外提供統(tǒng)一的訪問接口楚殿。)
5,策略模式(策略模式和工廠模式的區(qū)別竿痰,策略模式側(cè)重方法具體的的實現(xiàn)脆粥,工廠模式側(cè)重對象的創(chuàng)建。)
6影涉,適配器模式()
7变隔,觀察者模式(一個對象和多個對象產(chǎn)生關(guān)聯(lián),當這個對象發(fā)生變化時其他的關(guān)聯(lián)對象(觀察者)也能接受到相應(yīng)變化)
8蟹倾,責任鏈的模式(攔截器采用的是責任鏈的模式)
五匣缘,Retrofit總結(jié)
- 基于OkHttp的一個封裝框架。最終所有的網(wǎng)絡(luò)請求最終是走OkHttp鲜棠。
- 可以實現(xiàn)網(wǎng)絡(luò)傳送內(nèi)容的裝換肌厨。也就是Coverter的實現(xiàn)。
3.可以對返回來的數(shù)據(jù)進行本地的適配豁陆,返回一個應(yīng)用層可以直接用的對象柑爸。也就是CallAdapter實現(xiàn)。
4.Retrofit的最大優(yōu)點是可以進行很好解耦献联。