Android中有很多的第三方控件,其中OkHttp是一個很強大的用於網絡加載的第三方框架,當然了,它的內部也是使用原生的代碼封裝好的。今天我們就來看一下OkHttp的簡單用法:
說到網絡請求,肯定就分get和post兩種了,這里我們說一下get和post的簡單實用:
首先我們需要先在我們的項目中引入OkHttp的依賴,在你的項目的gradle下面的dependencies下添加依賴:
1 compile 'com.squareup.okhttp3:okhttp:3.4.1'
然后同步項目,會自動下載OkHttp相關的依賴。或者也可以這樣,選中此工作空間的設置:
----》選中你要添加依賴(要使用OkHttp)的項目,選擇添加類庫依賴
在搜索框中輸入你想要下載的第三方框架,點搜索哪個按鈕,選中想要下載的,點擊OK,完成。
- Get方式:我們先看一段代碼:
1 private void httpget() { 2 //okhttpclient :okthttp主要類 3 OkHttpClient client=new OkHttpClient(); 4 /* 5 Request:請求服務端 6 Request.Builder():設計模式:將一個復雜的對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示,他的每一個屬性的設置都返回一個builder對象,也就是說可以一直使用.XX的形式為其設置屬性 7 build:結束,返回Request對象 8 */ 9 Request request=new Request.Builder().url(path).build(); 10 //Call 將你的請求封裝成任務 11 Call call=client.newCall(request); 12 //請求調度 13 call.enqueue(new Callback() { 14 //失敗 15 @Override 16 public void onFailure(Call call, IOException e) { 17 18 } 19 //成功 20 @Override 21 public void onResponse(Call call, Response response) throws IOException { 22 //返回String 23 String json=response.body().string(); 24 Log.i("TAG","----->get"+json); 25 //返回byte[] 26 response.body().bytes(); 27 //返回流 28 response.body().byteStream(); 29 } 30 }); 31 }
如上所示,我們要使用OkHttp的時候,首先要先new一個OkHttpClient對象,OkHttpClient是其一個主要的類,Response對象用來構建我們需要額外傳遞的值(如head,method等)和一些其他需要設置的參數,而Call對象是用來封裝任務並執行調度的。我們調用call.enqueue()方法,將call加入調度隊列,在enqueue()方法中我們通過匿名內部類的形式實現這個CallBack接口,並實現其中的兩個方法,onFailure()方法是請求網絡失敗的時候會執行的方法,onResponse()是請求成功的時候會執行的方法。我們主要看onResponse()方法,可以看到,我們在onResponse()方法中通過回傳的Response對象得到我們想要的網絡請求的數據。通過response.body()方法我們能得到ResponseBody對象,在這個對象中我們可以通過方法獲得到字符串、字節數組和輸入流。也就是說這個地方是支持大文件下載的。不過也說明了onResponse()方法不是在主線程中執行的,同樣的,onFailure()方法也是在子線程中執行,只要我們調用了enqueue(),OkHttp會為我們開啟一個子線程。我們可以通過使用handler來實現UI更新。當然,我們也可以像這樣通過call.excute()方法直接返回一個Response()對象:
1 OkHttpClient client = new OkHttpClient(); 2 Request request = new Request.Builder().url(path).build(); 3 try { 4 Response res = client.newCall(request).execute(); 5 Log.d("tag", "onResponse: "+res.body().string()); 6 } catch (IOException e) { 7 e.printStackTrace(); 8 }
- Post方式:
1 private void httppost() { 2 //okhttpclient :okthttp主要類 3 OkHttpClient client=new OkHttpClient(); 4 /* 5 RequestBody:請求體,攜帶參數去服務端訪問 6 FormBody:設置表單參數,用它來設置要攜帶的參數 7 FormBody.Builder():設計模式:將一個復雜的對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示 8 build:結束,返回一個RequestBody 9 */ 10 RequestBody body=new FormBody.Builder().add("name","xiaoming").add("age","18").build(); 11 //創建Request 12 Request request=new Request.Builder().url(path).post(body).build(); 13 //Call 將你的請求封裝成任務 14 Call call=client.newCall(request); 15 //請求調度 16 call.enqueue(new Callback() { 17 //失敗 18 @Override 19 public void onFailure(Call call, IOException e) { 20 21 } 22 //成功 23 @Override 24 public void onResponse(Call call, Response response) throws IOException { 25 String json= response.body().string(); 26 Log.i("TAG","----->post"+json); 27 28 response.body().byteStream(); 29 response.body().bytes(); 30 } 31 }); 32 }
get方式請求如果熟悉了,post其實與它一樣,只是在構建的時候需要多傳遞幾個參數而已。可以看到,我們在上面構建Request對象的時候先構建了一個RequestBody對象,有代碼可見,RequestBody對象也是一個Builder設計模式,設置完參數后不要忘了調用其build()方法完成構建。在封裝Request對象的時候有點不同:
1 Request request=new Request.Builder().url(path).post(body).build();
可以看到我們在設置了其url屬性后又調用了post,並將剛才構建的RequestBody()對象傳遞進去。這說明我們使用的post方式。下面的請求調度方法與get相同,不再贅述。
可以看到,網絡訪問的代碼還是不少的,如果每次網絡訪問我們都要寫這么多的代碼的話,那可毀了,所以我們下面去封裝一個工具類,這里以get方式為例:
1 package ggcomic.rabbit.lx.ggcomic.utils; 2 3 import java.io.IOException; 4 5 import okhttp3.Call; 6 import okhttp3.OkHttpClient; 7 import okhttp3.Request; 8 import okhttp3.Response; 9 10 /** 11 * OkHttp網絡加載(單例模式) 12 * Created by Lx on 2016/9/12. 13 */ 14 public class OkHttpUtils { 15 public OkHttpUtils() { 16 } 17 18 public static OkHttpUtils okHttpUtils = new OkHttpUtils(); 19 20 public static OkHttpUtils getInstance() { 21 return okHttpUtils; 22 } 23 24 OkHttpClient client = new OkHttpClient(); 25 26 /** 27 * 官方 28 * 直接得到string字符串 29 * @param path 30 * @return 31 * @throws IOException 32 */ 33 public String run(String path) throws IOException { 34 Request request = new Request.Builder().url(path).build(); 35 //官方封裝的方法,沒有請求調度,在使用該工具類的時候要啟動一個線程, 36 // 使用client.newCall(request).enqueue(new CallBack(){...})的時候不需要啟動線程 37 Response response = client.newCall(request).execute(); 38 return response.body().string(); 39 } 40 41 /** 42 * 非官方 43 * 獲得call實例 44 * @param path 45 * @return 46 */ 47 public Call getCallInstance(String path) { 48 Request request = new Request.Builder().url(path).build(); 49 Call call = client.newCall(request); 50 return call; 51 } 52 53 }
這里我們使用了單例模式的餓漢式寫法。這里工具類的寫法有兩種,一種是官方的,一種是非官方的,看代碼可以知道,官方封裝的方法無法處理請求失敗時的操作,因為它直接返回給我們一個Response對象,而非官方的是我自己的寫法,這里返回一個Call對象,我們在代碼中使用非官方的寫法:
1 OkHttpUtils.getInstance().getCallInstance(String url).enqueue(new Callback() { 2 @Override 3 public void onFailure(Call call, IOException e) { 4 handler.post(new Runnable() { 5 @Override 6 public void run() { 7 //網絡連接失敗時的操作 8 } 9 }); 10 } 11 12 @Override 13 public void onResponse(Call call, Response response) throws IOException { 14 //網絡連接成功時的操作 15 } 16 });
我們先是調用getInstance()方法得到一個OkHttp實例,然后再調用其中的方法,在里面完成相應的操作即可。
到這里OkHttp的簡單的使用就結束了,其實算算沒有多少代碼,還是比較簡單的對吧~如果想要深入的了解OkHttp,請移文鴻洋大神的這篇博客:
Android OkHttp完全解析 是時候來了解OkHttp了
寫的特別的全面。