OkHttp同步方法總結(jié)
1.創(chuàng)建OkHttpClirnt和Request對象 慎玖,通過Builder模式創(chuàng)建
2.將Request封裝成Call對象
3.調(diào)用Call的execute()發(fā)送同步請求
OkHttp同步需要注意
發(fā)送請求后贾铝,就會進(jìn)入阻塞狀態(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.判斷當(dāng)前call
2.封住成一個AsyncCall對象
3.client.dispatcher().enqueue()
發(fā)送同步和異步都會有dispatcher完成
dispatcher的作用為維護(hù)請求的狀態(tài)凭舶,并維護(hù)一個線程池,用于執(zhí)行請求爱沟。
攔截器
創(chuàng)建一系列攔截器帅霜,并將攔截器放入到一個List集合中
創(chuàng)建一個攔截器鏈ReallnterceptorChain,并執(zhí)行攔截器鏈的proceed方法呼伸。
1.發(fā)起請求前對request進(jìn)行處理
2.調(diào)用下一個攔截器身冀,獲取respone
對respone進(jìn)行處理,返回給上一個攔截器
重定向攔截器
創(chuàng)建StreamAllocation對象
調(diào)用ReallnterceptorChain.proceed()進(jìn)行網(wǎng)絡(luò)請求
根據(jù)異常結(jié)果或者響應(yīng)結(jié)果判斷 是否進(jìn)行重新請求
調(diào)用下一個攔截器,對respone進(jìn)行處理搂根,返回給上一個攔截器
BridgeInterceptor橋接攔截器
1.是負(fù)責(zé)將用戶構(gòu)建的一個Request請求轉(zhuǎn)化為能夠進(jìn)行網(wǎng)絡(luò)訪問的請求
2.將這個符合網(wǎng)絡(luò)請求的Request進(jìn)行網(wǎng)絡(luò)請求
3.將網(wǎng)絡(luò)請求回來的響應(yīng)Resuest轉(zhuǎn)化為用戶 可用的Response珍促。
緩存策略
如何使用:創(chuàng)建OkhttpClient創(chuàng)建cache進(jìn)行緩存
Cache的put方法
DisklruCache? ? 寫入?
加密
entry.writeto進(jìn)行緩存
判斷是不是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)復(fù)用Connection沐悦,對他有效的進(jìn)行清理回收工作
get由for循環(huán)遍歷連接池的connection,獲取一個可用的connection五督,判斷這個連接是否可供我們使用藏否,可以的時候調(diào)用acquire獲取我們的連接池。
put做一個異步的清理任務(wù)
1.產(chǎn)生一個StreamAllocation對象
2.StreamAllocation對象的弱應(yīng)用添加到RealConnection對象的allocations集合中
3.從鏈接池中獲取
如何實(shí)現(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é)議進(jìn)行封裝的編程調(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如何實(shí)現(xiàn)?
TCP客戶端:
TCP服務(wù)端:
HttpClient:
HttpURLConnection:
2.了解websocket嗎凭豪?知道和socket的區(qū)別嗎?okhttp是如何處理websocket的相關(guān)問題的晒杈?
推送技術(shù):輪詢
輪詢是在特定的時間間隔嫂伞,由瀏覽器對服務(wù)器發(fā)出的HTTP請求,然后由服務(wù)器返回最新的數(shù)據(jù)給客戶端的瀏覽器。
短輪詢
缺點(diǎn):在某個時間段server沒有更新數(shù)據(jù)帖努,但client仍然每隔一段時間發(fā)送請求來詢問撰豺,所以這段時間內(nèi)的詢問都是無效的。
長輪詢
輪詢?nèi)秉c(diǎn):浪費(fèi)帶寬(HTTP HEAD是比較大的)
消耗服務(wù)器CPU占用
WebSocket如何交互
WebSocket與HTTP同等的網(wǎng)絡(luò)協(xié)議
雙向通信協(xié)議
WebSocket與Socket
Socket其實(shí)并不是一個協(xié)議
WebSocket是一種協(xié)議
他倆沒關(guān)系
WebSocket
1.本質(zhì)上是一個基于TCP的協(xié)議
2.向服務(wù)器發(fā)起一個HTTP請求/“Upgrade:WebSocket”
3.服務(wù)器端解析這些附加的頭信息
3.Http如何處理緩存拼余?OkHttp如何處理緩存相關(guān)的問題污桦?
Http緩存:強(qiáng)制緩存:
Expires:值為服務(wù)端返回的到期時間,
問題:到期時間是由服務(wù)端生成的
Cache-Control:是由服務(wù)器返回的Response中添加的頭信息匙监。
private凡橱,public,max-age亭姥,no-cache稼钩,no-store????
對比緩存:
首先需要進(jìn)行比較判斷是否可以使用緩存
服務(wù)器會將緩存標(biāo)識與數(shù)據(jù)一起返回給客戶端
Etag:服務(wù)器響應(yīng)請求時,告訴瀏覽器當(dāng)前資源在服務(wù)器唯一的標(biāo)識达罗。
If-None-Match:再次請求服務(wù)器時坝撑,通過此字段通知服務(wù)器客戶端緩存數(shù)據(jù)的唯一標(biāo)識
Last-Modified:服務(wù)器在響應(yīng)請求時,告訴瀏覽器資源的最后修改時間
If-Modified-Since:再次請求服務(wù)器時粮揉,通過此字段通知服務(wù)器上次請求時巡李,服務(wù)器返回的資源最后修改時間
4.斷點(diǎn)續(xù)傳的原理?如何實(shí)現(xiàn)扶认?OkHttp中如何實(shí)現(xiàn)相關(guān)的問題侨拦?
斷點(diǎn)續(xù)傳:從文件已經(jīng)下載的地方繼續(xù)開始下載
HttpURLConnection斷點(diǎn)續(xù)傳
OkHttp斷點(diǎn)續(xù)傳
5.多線程下載原理okhttp如何實(shí)現(xiàn)?
多線程下載:每個線程只負(fù)責(zé)下載文件的一部分
HttpURLConnection多線程下載
6.文件上傳如何做蝠引?原理阳谍?okhttp如何完成文件上傳?
Http之contentType
Content-Type屬性指定請求和響應(yīng)的HTTP內(nèi)容類型螃概。
7.json數(shù)據(jù)如何去解析矫夯?Okhttp如何去解析json數(shù)據(jù)?
8.okhttp如何處理https吊洼?