Retrofit主要是在create方法中採用動態代理模式實現接口方法;這個過程構建了一個ServiceMethod對象,根據方法註解獲取請求方式、參數類型、參數註解,而後拼接網絡請求的連接;當咱們主動發起網絡請求的時候會調用okhttp發起網絡請求,okhttp的配置包括請求方式、URL等在Retrofit的RequestBuilder的build()方法中實現,併發起真正的網絡請求。java
大概原理
經過java接口以及註解來描述網絡請求,並用動態代理的方式,在調用接口方法先後(before/after)注入本身的方法,before經過接口方法和註解生成網絡請求的request,after經過client調用相應的網絡框架(默認okhttp)去發起網絡請求,並將返回的response經過converterFactorty轉換成相應的數據model,最後經過calladapter轉換成其餘數據方式(如rxjava Observable)api
· 動態代理
代理對象攔截真實對象的方法調用,在真實對象調用前/後實現本身的邏輯調用
見Retrofit.create()方法緩存
· 重點類
1.Retrofit類: 建立接口api的動態代理對象(create()返回api service動態代理對象,調用代理對象上的方法時,會觸發代理對象上的invoke方法,這裏面會封裝好OKHttpCall對象,OKHttpCall的數據返回根據calladapter轉換爲Observable)
2.ServiceMethod類: 解析方法和註解,生成HttpRequest(toRequest方法;建立responseConverter(將response流轉換爲String或者實體類); 建立callAdapter(轉換爲rxjava observable)
3.OKHttpCall: 封裝okhttp3的調用網絡
4.Rxjava2CallAdapter: 轉換成Observable (BodyObservable會對http code作檢查,若是錯誤直接走onError流程) 架構
或者併發
1. 經過建造者模式構建一個Retrofit實例,配置baseUrl,callAdapterFactory(將代理返回的Call對象轉化爲其餘,好比Rxjava的Observer),converterFactory(結果的轉化器,將請求的結果轉化爲特定的對象時使用,好比GsonConverterFactory)框架
2.經過Retrofit對象的create(Class<T> service)方法返回一個Service的動態代理對象,在調用service的方法的時候,就是調用動態代理的invoke方法。
3.調用代理的invoke方法的時候,會將method進行解析,解析咱們在接口裏面配置的各類註解,最後構形成ServiceMethod對象,並將結果緩存起來,下次再次調用就不用解析了。ServiceMethod對象能夠生成Request對象,因此將ServiceMethod對象注入到OkHttpCall,而後經過callAdapter轉化爲用戶但願獲得的返回對象,默認是直接返回Call對象。
4.返回Call對象以後,咱們再調用execute或者enqueue方法,前者是同步請求,後者是異步請求,再方法裏面會調用Okhttp的網絡請求方法。異步
綜上所述,Retrofit就是一個封裝了Http請求的框架,底層的網絡請求都是使用的Okhttp,自己只是簡化了用戶網絡請求的參數配置等,還能與Rxjava相結合,使用起來更加簡便。
---------------------
做者:ActiveLi
來源:CSDN
原文:https://blog.csdn.net/ActiveLi/article/details/80610031
版權聲明:本文爲博主原創文章,轉載請附上博文連接!ui