Android小知識-OkHttp的兩種請求方式
本平臺的文章更新會有延遲,大家可以關注微信公眾號-顧林海,第一時間獲取Android小知識系列的文章,本系列文章如果對您有所幫助,麻煩關注微信公眾號,您的支援就是我更新下去的動力,謝謝
OkHttp是目前非常火的網路庫,支援HTTP/2,允許所有同一個主機地址的請求共享同一個socket連線,連線池減少請求延時,透明的GZIP壓縮減少響應資料的大小,快取響應內容,避免一些完全重複的請求。
OkHttpClient
private OkHttpClient mHttpClient = null; private void initHttpClient() { if (null == mHttpClient) { mHttpClient = new OkHttpClient.Builder() .readTimeout(5, TimeUnit.SECONDS)//設定讀超時 .writeTimeout(5,TimeUnit.SECONDS)////設定寫超時 .connectTimeout(15,TimeUnit.SECONDS)//設定連線超時 .retryOnConnectionFailure(true)//是否自動重連 .build(); } }
在使用OkHttp請求網路時,需要先獲取一個OkHttp的客戶端物件OkHttpClient,OkHttpClient可以直接通過new來建立,也可以通過OkHttpClient靜態內部類Builder來建立,日常開發最常用的是通過build的方式(建造者模式+鏈式呼叫)來建立,靜態內部Builder提供了很多方法,比如readTimeout代表讀時間、writeTimeout代表寫時間、connectTimeout代表連線超時時間以及retryOnConnectionFailure代表是否重連等等方法,有了OkHttpClient之後就可以進行網路的同步和非同步請求。
同步請求
private void synRequest() { Request request=new Request.Builder() .url("http://www.baidu.com") .get() .build(); Call call=mHttpClient.newCall(request); try { Response response=call.execute(); System.out.println(request.body().toString()); } catch (IOException e) { e.printStackTrace(); } }
進行網路請求時,需要先建立一個請求物件Request,Request物件也是通過build方式建立,在Request的靜態內部類Builder中定義了設定請求地址、請求方式、請求頭的方法。
接著建立Call物件,Call物件可以理解為Request和Response之間的一個橋樑,最後通過Call物件的execute方法完成Response的讀取,
總結同步請求的三個步驟如下:
-
建立OkHttpClient和Request物件。
-
將Request物件封裝成Call物件。
-
呼叫Call的execute()方法傳送同步請求。
注意:OkHttp的同步請求會阻塞當前執行緒,因此不能在UI執行緒中請求,需要開啟子執行緒,在子執行緒中傳送請求。
非同步請求
private void asyRequest() { final Request request=new Request.Builder() .url("http://www.baidu.com") .get() .build(); Call call=mHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { System.out.println(request.body().toString()); } }); }
非同步請求與同步請求的前兩步都是一樣的建立OkHttpClient和Request物件以及將Request物件封裝成Call物件,通過Call物件的enqueue方法執行非同步請求,enqueue傳入一個Callback物件,Callback提供了兩個回撥方法,分別是成功和失敗。
總結非同步請求的三個步驟如下:
-
建立OkHttpClient和Request物件。
-
將Request物件封裝成Call物件。
-
呼叫Call的enqueue方法進行非同步請求。
注意:OkHttp的非同步請求,其中兩個回撥方法onResponse和onFailure都是在工作執行緒中執行的,執行結果可以通過Handler來發送。

838794-506ddad529df4cd4.webp.jpg
搜尋微信“顧林海”公眾號,定期推送優質文章。