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以後的版本,這兩個版本有的方法使用上有些許的不同)
okhttp
okhttp
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();
            }
        }); 

熱門詞條

聯絡我們