Android OKhttp原來是切面編程

一、Okhttp三步走

1、創建OKhttpClient和Request

2、創建Call

3、調用Call的請求方法

二、OkHttp的重要類

Dispatcher:

用來分配同步和異步的請求。裏面維護了一個線程池用來異步請求。符合生產者消費者模型設計。

同步請求直接添加到同步執行隊列中,然後調用。

異步請求分兩個情況,如果執行線程小於64且host小於5,則直接加入異步執行隊列,否則進入異步就緒隊列。然後調用。

Interceptor:

攔截器鏈。用來在網絡請求前包裝請求頭,請求體,判斷是否使用緩存,複用connection等,也負責在網絡返回後進行解壓,緩存,重試等一系列操作。

攔截器其實一種切面編程,每一個攔截器針對下一個攔截器進行切面編程。總體上攔截器對網絡請求本身進行了切面編程。這樣做可以減少判斷和解耦代碼職責。

三、Okhttp具體都有哪些優化

1、Connection連接池

http請求每次都會經歷三次握手才能建立連接,okhttp針對這一點進行了優化建立了一個connectionpoll的連接池,裏面維護着我們需要連接的connection,5個空閒的連接。這樣就實現了減少握手次數的作用。

2、請求線程池

okhttp針對異步請求,建立了一個線程池來維護請求。核心線程數爲0,這也就意味着okhttp的線程池所有線程都會在閒置時進行回收。最大執行任務數並沒有讓線程池進行維護,而是自己建立了一個執行隊列和就緒隊列來進行維護。

3、支持GZIP來減少數據流量

這個由BridgeInterceptor來進行切面編程實現,對CacheInterceptor進行執行完畢編程,進行無縫解壓行爲。

4、緩存響應數據來減少重複的網絡請求

這個有CacheInterceptor進行實現,不管是否使用緩存,前切面都會去判斷是否有緩存,有就返回沒有就進行網絡請求。而是否緩存則是後切面進行實現。

需要注意的是,OKHttp只對GET方法進行緩存。

爲什麼只緩存GET不緩存POST或者其他呢?因爲約定上,GET方法請求到的東西是不變的,而POST會頻繁修改參數和提交表單等操作,不符合編程約定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章