一、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會頻繁修改參數和提交表單等操作,不符合編程約定。