android網路框架之OKhttp
一個處理網路請求的開源項目,是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso)
用於替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,現在已經打不出來)
基本介紹
- 中文名:okhttp
- 外文名:okhttp
- 是否開源:是
- 適用平台:android
- 作用:套用廣泛的Android網路框架
- 作者:Square公司
優勢,功能,使用步驟,
優勢
允許連線到同一個主機地址的所有請求,提高請求效率
共享Socket,減少對伺服器的請求次數
通過連線池,減少了請求延遲
快取回響數據來減少重複的網路請求
減少了對數據流量的消耗
自動處理GZip壓縮
功能
get,post請求
檔案的上傳下載
載入圖片(內部會圖片大小自動壓縮)
支持請求回調,直接返回對象、對象集合
支持session的保持
使用步驟
Android Studio的用戶:
使用Studio的圖形管理進行添加.(注意:okhttp有2.0版本和3.0以後的版本,這兩個版本有的方法使用上有些許的不同)
Eclipse的用戶:
可以下載最新的jar okhttp he latest JAR ,添加依賴就可以用了。
最新的jar地址:okio the latest JAR
注意:okhttp內部依賴okio,同時導入okio:
注意:使用網路在清單檔案添加許可權:<uses-permission android:name="android.permission.INTERNET"/>
(一)Http Get的使用步驟:
對了網路載入庫,最常見的是http get請求了,比如獲取一個網頁的內容。
//1.創建OkHttpClient對象,並設定連線逾時時間(讀取的可寫可不寫)
OkHttpClient mOkHttpClient = new OkHttpClient();
注意:這種設定逾時時間是OKhttp2.0特有的通過方法來進行設定
mOkHttpClient.setConnectTimeout(10,TimeUnit.SECONDS);mOkHttpClient.setReadTimeout(10,TimeUnit.SECONDS);mOkHttpClient.setWriteTimeout(10,TimeUnit.SECONDS);
提示:設定逾時時間在OKhttp3.0以後,使用build的方式進行
OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10,TimeUnit.SECONDS) .writeTimeout(10,TimeUnit.SECONDS) .build();
//02.通過build來創建一個Request請求,沒有設定get,而是直接設定一個url地址,默認就是一個get方式
final Request request = new Request.Builder() url("https://xxxx.易大師.xxxxx") .build();
//03.創建一個call對象,參數就是Request請求對象,傳送請求
Call call = mOkHttpClient.newCall(request);
//04.請求加入調度 call.enqueue(new Callback() { //請求失敗執行的方法 public void onFailure(Request request, IOException e){} //請求成功執行的方法,response就是從伺服器得到的參數,response.body()可以得到任意類型,字元串,位元組 public void onResponse(final Response response) throws IOException { //這段代碼可以拿到伺服器的字元串.(通過response.body還可以拿到多種數據類型) //String htmlStr = response.body().string(); } });
get請求的步驟總結:首先構造一個Request對象,參數必須有個url參數,當然可以通過Request.Builder設定更多的參數比如:header、method等。
然後通過request的對象去構造得到一個Call對象,類似於將請求封裝成了任務,既然是任務,就會有execute()和cancel()等方法。
最後,以異步的方式去執行請求,所以調用的是call.enqueue,將call加入調度佇列,然後等待任務執行完成,在Callback中即可得到結果。
整體的寫法還是比較長的,所以封裝肯定是要做的。
okhttp注意:
onResponse回調的參數是response,一般情況下
- 獲得返回的字元串,通過response.body().string()獲取;
- 獲得返回的二進制位元組數組,則調用response.body().bytes();//通過二進制位元組數組,可以轉換為BItmap圖片資源
- 獲得返回的inputStream,則調用response.body().byteStream() ;這裡支持大檔案下載,有inputStream可以通過IO的方式寫檔案。
不過也說明一個問題,這個onResponse執行的執行緒並不是UI執行緒(主執行緒不能有耗時操作)。如果希望操作控制項,還是需要使用handler等
例如:public void onResponse(final Response response) throws IOException{ final String res = response.body().string(); runOnUiThread(new Runnable() { public void run() { TextView控制項對象.setText(res); } });}
這裡是異步的方式去執行,也支持阻塞的方式,Call有一個execute()方法,可以直接調用call.execute()通過返回一個Response,最下面的代碼就是
(二) Http Post 攜帶參數的使用步驟:
與get請求格式基本一致,就是Request的構造的不同。基於Http的檔案,字元串,鍵值上傳
//0.0.RequestBody里所使用的上傳參數的設定.(傳一個字元串) 定義為成員變數:JSON:MediaType JSON = MediaType.parse("application/json; charset=utf-8");//"類型,位元組碼" String json = "{\n" + "\"name\": \"hello.android6.0\"\n" + "}";//就是一個字元串. //0.0.通過post傳一個檔案,非常方便. MediaType FIle = MediaType.parse("application/octet-stream"); File file = new File(Environment.getExternalStorageDirectory(), "檔案名稱.mp4");//得到一個mp4的檔案,file對象 //01.創建OkHttpClient對象. OkHttpClient mOkHttpClient=new OkHttpClient(); //02.通過create,創建一個RequestBody(參數1:數據類型 參數2:字元串,檔案,byte數組..) RequestBody requestBody = RequestBody.create(JSON, json); //RequestBody requestBody = RequestBody.create(FIle , file );//上傳一個檔案的話 //03.通過build來創建一個Request請求,需要指定post方式,並把RequestBody對象放入. Request request = new Request.Builder() .url("http://XXX/易大師/YYY") .post(requestBody對象) .build(); //04.創建一個call對象( 也可以省略的寫為:mOkHttpClient.newCall(request).enqueue(new Callback(){.......});) Call call = mOkHttpClient.newCall(request對象); //05.請求加入調度(傳送請求) call.enqueue(new Callback() { //請求失敗執行的方法 public void onFailure(Request request, IOException e){} //請求成功執行的方法,response就是從伺服器得到的參數 public void onResponse(final Response response) throws IOException { //String htmlStr = response.body().string(); } });
注意:後面的就和上面一樣了。
(三)使用post進行表單(鍵值對)上傳
(上一個使用的Create創建RequesBody)通過Builder構造RequestBody,叫做MultipartBuilder,一般用來用來上傳表單(鍵值對)
//01.創建OkHttpClient對象. OkHttpClient mOkHttpClient=new OkHttpClient(); //02.通過new FormEncodingBuilder()調用build方法,創建一個RequestBody,可以用add添加鍵值對 RequestBody requestBody = new FormEncodingBuilder() .add("YYY", "XXX") .add("version", "23") .build(); 注意:okhttp3.0以後就不能用採用FormEncodingBuilder的方式來創建表格,而是採用FormBody 2.通過new FormBody()調用build方法,創建一個RequestBody,可以用add添加鍵值對 FormBody formBody = new FormBody.Builder() .add("XXX",易大師) .add("YYY",YCF) .build(); //03.通過build來創建一個Request請求,需要指定post方式,並把RequestBody對象放入 Request request = new Request.Builder() .url("http://XXX/易宸鋒/YYY") .post(requestBody對象) .build(); //04.創建一個call對象( 也可以省略的寫為:mOkHttpClient.newCall(request).enqueue(new Callback(){.......});) Call call = mOkHttpClient.newCall(request對象); //05.請求加入調度(傳送請求) call.enqueue(new Callback() { //請求失敗執行的方法 public void onFailure(Request request, IOException e){} //請求成功執行的方法,response就是從伺服器得到的參數 public void onResponse(final Response response) throws IOException { //String htmlStr = response.body().string(); } });