Retrofit 以其性能好,速度快,有很方便的Restful Api 以及數據封裝、轉換,被你們普遍使用,跟蹤學習一下其網絡請求的流程。網絡
網絡框架結構以下:框架
框架中主要用到4個接口:性能
一、Call 用來發送網絡請求的,其子類你能夠內部自定義實現,通常用默認的http請求學習
二、CallAdapter 用來將Call轉換爲其餘對象 (例如:Observable)支持RxJava的轉換spa
三、Convert 用來將返回的數據轉爲Java對象 支持XML、Gson、Protobuf3d
四、Callback 用來回調網絡請求的成功或者失敗代理
其使用很少說code
重點在Retrofit的create方法 跟蹤Create方法:對象
Create方法使用的了代理模式 也就是說上邊建立的ApiService對象實際上是個代理對象,真正實現網絡請求是在該代理對象調用具體方法的時候纔去實現的blog
在該對象調用具體請求方法時必然會被代理攔截到 並調用InvocationHandler的invoke方法,在此方法中實現了serviceMethod的建立,以及具體的請求對象(okhttpCall)建立
如上圖,在loadServiceMethod裏經過反射將請求方法的註解中的請求參數以及返回的類型獲取到獲得serViceMethod對象
繼續往下看adapt()方法,這裏Adapt方法的實現類是RxJava2CallAdapter類
若是使用的一部請求則使用CallEnqueueObservable
若是使用的是同步方法則使用CallExecuteObservable
截止目前咱們得到的對象只是個請求對象,那麼何時纔去發送這個請求呢 咱們配合Retrofit使用的是RXJava
當執行到subscribe()方法的時候:
這裏的subscribeActual的實現類是CallEnqueueObservable或者CallExecuteObservable類 以同步方法爲例:
到這裏纔是真正發送請求的地方,繼續點擊去看execute():這裏execute的實現類是OKHttpCall類:
這裏纔是真正去請求,這裏調用的execute方法是RealCall的方法:
在這裏獲得返回的值並轉化爲了Response對象 其中的getResponseWithInterceptorChain 就是處理一連串咱們在初始化Retrofit時的okHttp裏邊的攔截器
先將咱們定義的攔截器添加到攔截器列表最後又添加了幾個固定的攔截器,這裏的攔截器的處理邏輯是從index爲0一直將每一個攔截器走一遍,
最後一個攔截器獲得的是真實的返回數據,再一層層返回給前邊的攔截器,其中的CallServerInterceptor是真正的網絡請求攔截器,也是最後一個走的攔截器
CallServerInterceptor攔截器:裏邊發送請求數據
接收請求的數據:
就這樣一層層的將response返給上層的攔截器 最終返給了OKHttpCall裏邊的parseResponse方法
在此方法中就將返回的數據經過serviceMethod封裝爲我們一開始在請求接口類裏定義的類型
對應的類型是:LoginData
@POST(HttpConstant.LOGIN) Observable<LoginData> login(@Body RequestBody body);
具體的轉換過程:
這裏的responseConverter是這麼建立的:
這裏的responseType在本類這樣建立的
繼續看callAdapter的建立方法:
這裏的adapterFactories其實就是我們建立retrofit對象的addCallAdapterFactory
到這裏咱們知道了responseType其實就是LoginData,那麼接着看responseConverter的建立
這裏的converterFactories 其實來源就在這裏:
這下全都明白了:
總結就是 Retrofit配合了RxJava使用先將call對象轉爲RxJava的Observable對象,經過subscribe去執行這個請求 ,
返回的數據就經過一層層攔截器過濾以後再通過OKHttpCall 的parseResponse方法將返回的數據經過我們配置的ConverterFactory轉化爲一開始定義的返回類型(LoginData);
多看源代碼 理解更深入,祝你們更上一層樓!