2019-06-12

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?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇文章主要講 Android 網(wǎng)絡(luò)請求時所使用到的各個請求庫的關(guān)系,以及 OkHttp3 的介紹。(如理解有誤,...
    小莊bb閱讀 1,328評論 0 4
  • 關(guān)于okhttp是一款優(yōu)秀的網(wǎng)絡(luò)請求框架,關(guān)于它的源碼分析文章有很多,這里分享我在學習過程中讀到的感覺比較好的文章...
    蕉下孤客閱讀 3,726評論 2 38
  • 2.okhttp3.0整體流程:1).創(chuàng)建okhttpclient客戶端對象,表示所有的http請求的客戶端的類,...
    無為3閱讀 434評論 0 1
  • 前言 用OkHttp很久了,也看了很多人寫的源碼分析,在這里結(jié)合自己的感悟,記錄一下對OkHttp源碼理解的幾點心...
    Java小鋪閱讀 1,607評論 0 13
  • 冬至節(jié)來不遠春, 一年萬象始更新。 青絲霜染蒼華嘆, 未老天光漸老人。
    山園疏影閱讀 966評論 15 23

友情鏈接更多精彩內(nèi)容