OkHttp同步方法總結(jié)
1.創(chuàng)建OkHttpClirnt和Request對象 ,通過Builder模式創(chuàng)建
2.將Request封裝成Call對象
3.調(diào)用Call的execute()發(fā)送同步請求
OkHttp同步需要注意
發(fā)送請求后,就會進入阻塞狀態(tài),知道收到響應(yīng)。
異步:
1.創(chuàng)建OkHttpClirnt和Request對象 ,通過Builder模式創(chuàng)建
2.將Request封裝成Call對象
3.調(diào)用Call的enqueue()發(fā)送異步請求
開啟一個新的線程
區(qū)別:
發(fā)送請求的方法調(diào)用
阻塞線程與否,同步會,異步不會,會開啟一個新的線程
同步流程:
異步流程:
1.判斷當前call
2.封住成一個AsyncCall對象
3.client.dispatcher().enqueue()
發(fā)送同步和異步都會有dispatcher完成
dispatcher的作用為維護請求的狀態(tài),并維護一個線程池,用于執(zhí)行請求。
攔截器
創(chuàng)建一系列攔截器,并將攔截器放入到一個List集合中
創(chuàng)建一個攔截器鏈ReallnterceptorChain,并執(zhí)行攔截器鏈的proceed方法。
1.發(fā)起請求前對request進行處理
2.調(diào)用下一個攔截器,獲取respone
對respone進行處理,返回給上一個攔截器
重定向攔截器
創(chuàng)建StreamAllocation對象
調(diào)用ReallnterceptorChain.proceed()進行網(wǎng)絡(luò)請求
根據(jù)異常結(jié)果或者響應(yīng)結(jié)果判斷 是否進行重新請求
調(diào)用下一個攔截器,對respone進行處理,返回給上一個攔截器
BridgeInterceptor橋接攔截器
1.是負責將用戶構(gòu)建的一個Request請求轉(zhuǎn)化為能夠進行網(wǎng)絡(luò)訪問的請求
2.將這個符合網(wǎng)絡(luò)請求的Request進行網(wǎng)絡(luò)請求
3.將網(wǎng)絡(luò)請求回來的響應(yīng)Resuest轉(zhuǎn)化為用戶 可用的Response。
緩存策略
如何使用:創(chuàng)建OkhttpClient創(chuàng)建cache進行緩存
Cache的put方法
DisklruCache? ? 寫入?
加密
entry.writeto進行緩存
判斷是不是https
?緩存
判斷是否為GET 如果是則緩存,POST不用緩存
Cache的get方法
解密
網(wǎng)絡(luò)連接攔截器(ConnectInterceptor)
ConnectInterceptor獲取Interceptor傳過來的StreamAllocation,streamAllocation.newStream()
將剛才創(chuàng)建的用于網(wǎng)絡(luò)IO的RealConnection對象,以及對于與服務(wù)器交互最為關(guān)鍵的HttpCodec等對象傳遞給后面的攔截器。
newStream方法
1.弄一個RealConnectior對象
2.選擇不同的鏈接方式
3.CallServerIntercentor
連接池的put,get方法
ConnectionPool時間范圍內(nèi)復用Connection,對他有效的進行清理回收工作
get由for循環(huán)遍歷連接池的connection,獲取一個可用的connection,判斷這個連接是否可供我們使用,可以的時候調(diào)用acquire獲取我們的連接池。
put做一個異步的清理任務(wù)
1.產(chǎn)生一個StreamAllocation對象
2.StreamAllocation對象的弱應(yīng)用添加到RealConnection對象的allocations集合中
3.從鏈接池中獲取
如何實現(xiàn)自動回收
1.GC
使用了GC回收算法
2.StreamAllocation的數(shù)量
StreamAllocation的數(shù)量會漸漸變成0
3.cleanUpRunnable
被線程池檢測到并回收,這樣就可以保持多個健康的keep-alive連接。
CallServerInter攔截器
1.,向服務(wù)器發(fā)送網(wǎng)絡(luò)請求
2.接收服務(wù)器給我們的響應(yīng)
HttpCodes 編碼request? 解碼respone
網(wǎng)絡(luò)請求網(wǎng)絡(luò)的大致過程
1.Call對象對請求的封裝
2.dispatcher對請求的分發(fā)
3.getResponseWhithInterceptors()方法
RetryAndFollowUpInterceptor(重定向攔截器)
CacheInterceptor(緩存攔截器)
BridgeInterceptor(轉(zhuǎn)換攔截器)
ConnectionInterceptor(建立連接)
CallServerInterceptor(網(wǎng)絡(luò)請求)
OkHttp面試相關(guān)
1.Android基礎(chǔ)的網(wǎng)絡(luò)編程:socket,HttpClient和HttpURLConnection;
socket
1)socket是什么?
是一個對TCP/IP協(xié)議進行封裝的編程調(diào)用接口。
成對出現(xiàn),一對套接字:包括ip地址和Tcp協(xié)議。
socket就是基于我們應(yīng)用層和傳輸層之間抽象出來的一個層。通過它來發(fā)送接收數(shù)據(jù),使用socket可以將應(yīng)用程序添加到網(wǎng)絡(luò)中。
2)Socket通信模型?
基于TCP協(xié)議
采用字節(jié)流的形式來提供我們可靠的 字節(jié)流服務(wù)
基于UDP協(xié)議
采用數(shù)據(jù)保密的形式,提供我們數(shù)據(jù)的打包發(fā)送的數(shù)據(jù)
3)Socket與Http對比?
Android通信有兩種?
Http通信
Socket通信
區(qū)別:
Http:采用請求-響應(yīng)方式。HTTP協(xié)議屬于應(yīng)用層。?
Socket:采用服務(wù)器主動發(fā)送數(shù)據(jù)的方式,Socket屬于傳輸層。
4)Socket如何實現(xiàn)?
TCP客戶端:
TCP服務(wù)端:
HttpClient:
HttpURLConnection:
2.了解websocket嗎?知道和socket的區(qū)別嗎?okhttp是如何處理websocket的相關(guān)問題的?
推送技術(shù):輪詢
輪詢是在特定的時間間隔,由瀏覽器對服務(wù)器發(fā)出的HTTP請求,然后由服務(wù)器返回最新的數(shù)據(jù)給客戶端的瀏覽器。
短輪詢
缺點:在某個時間段server沒有更新數(shù)據(jù),但client仍然每隔一段時間發(fā)送請求來詢問,所以這段時間內(nèi)的詢問都是無效的。
長輪詢
輪詢?nèi)秉c:浪費帶寬(HTTP HEAD是比較大的)
消耗服務(wù)器CPU占用
WebSocket如何交互
WebSocket與HTTP同等的網(wǎng)絡(luò)協(xié)議
雙向通信協(xié)議
WebSocket與Socket
Socket其實并不是一個協(xié)議
WebSocket是一種協(xié)議
他倆沒關(guān)系
WebSocket
1.本質(zhì)上是一個基于TCP的協(xié)議
2.向服務(wù)器發(fā)起一個HTTP請求/“Upgrade:WebSocket”
3.服務(wù)器端解析這些附加的頭信息
3.Http如何處理緩存?OkHttp如何處理緩存相關(guān)的問題?
Http緩存:強制緩存:
Expires:值為服務(wù)端返回的到期時間,
問題:到期時間是由服務(wù)端生成的
Cache-Control:是由服務(wù)器返回的Response中添加的頭信息。
private,public,max-age,no-cache,no-store????
對比緩存:
首先需要進行比較判斷是否可以使用緩存
服務(wù)器會將緩存標識與數(shù)據(jù)一起返回給客戶端
Etag:服務(wù)器響應(yīng)請求時,告訴瀏覽器當前資源在服務(wù)器唯一的標識。
If-None-Match:再次請求服務(wù)器時,通過此字段通知服務(wù)器客戶端緩存數(shù)據(jù)的唯一標識
Last-Modified:服務(wù)器在響應(yīng)請求時,告訴瀏覽器資源的最后修改時間
If-Modified-Since:再次請求服務(wù)器時,通過此字段通知服務(wù)器上次請求時,服務(wù)器返回的資源最后修改時間
4.斷點續(xù)傳的原理?如何實現(xiàn)?OkHttp中如何實現(xiàn)相關(guān)的問題?
斷點續(xù)傳:從文件已經(jīng)下載的地方繼續(xù)開始下載
HttpURLConnection斷點續(xù)傳
OkHttp斷點續(xù)傳
5.多線程下載原理okhttp如何實現(xiàn)?
多線程下載:每個線程只負責下載文件的一部分
HttpURLConnection多線程下載
6.文件上傳如何做?原理?okhttp如何完成文件上傳?
Http之contentType
Content-Type屬性指定請求和響應(yīng)的HTTP內(nèi)容類型。
7.json數(shù)據(jù)如何去解析?Okhttp如何去解析json數(shù)據(jù)?
8.okhttp如何處理https?