okhttp

okhttp

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();            }        }); 

相關詞條

熱門詞條

聯絡我們