OKHttp的容易使用

 

OKHttp的簡單使用java

一方面,最近關於OKHttp的討論甚囂塵上,另外一方面,我最近也更新了android6.0,發如今6.0中HttpClient不能使用了,因而決定抽時間也看一下OKHttp,總結了一點東西,與你們分享。android

之前讀書的時候在學校用過GitHub上的一個開源控件AsyncHttpClient,當時解決了很多問題,上傳圖片以及download都能實現,感受還不錯,此次看完OKHttp,暫未發現二者在功能上的差別(若是哪位小夥伴發現了能夠告訴我一下)。git

官網對OKHttp的介紹仍是比較詳細,英文好的同窗能夠直接看官網的內容。使用OKHttp咱們就須要OKHttp的jar包,同時因爲OKHttp依賴於Okio,咱們也須要下載Okio的jar包。這兩個準備工做作好了就能夠開始了。github


1、發送Get請求json

Request是OKHttp訪問的請求,Callback是回調,有兩種調用方式,一種是call.execute,這種方式不會開啓新的線程,要在android中使用這個須要本身開啓一個新線程,而後在線程中調用這個東西,這樣反而麻煩了,因此我的推薦使用call.enqueue,call.enqueue會開啓一個新的線程,在新線程中調用網絡請求。這樣的話咱們就得經過Handler來與android UI交互了。markdown

okHttpClient = new OkHttpClient(); request = new Request.Builder().url(HTTPURL).build(); Call call = okHttpClient.newCall(request); // 開啓異步線程訪問網絡 call.enqueue(new Callback() { @Override public void onResponse(Response response) throws IOException { String res = response.body().string(); Message msg = new Message(); msg.what = REFRESHDATA; msg.obj = res; mHandler.sendMessage(msg); } @Override public void onFailure(Request arg0, IOException arg1) { } });

2、發送POST請求網絡

發送POST請求,一種是提交JSON數據:app

MediaType JSON = MediaType.parse("application/json; charset=utf-8"); RequestBody body = RequestBody.create(JSON, "{\"username\":\"lisi\",\"nickname\":\"李四\"}"); Request request = new Request.Builder().url(HTTPURL).post(body).build(); //後面的調用與GET相同

還有一種是提交鍵值對:異步

RequestBody formBody = new FormEncodingBuilder() .add("username", "lisi").add("nickname", "李四").build(); Request request = new Request.Builder().url(HTTPURL).post(formBody) .build();

總結ide

其實OKHttp相對於HttpURLConnection已經簡單了許多,可是我仍是以爲麻煩,並且官方亦不建議咱們建立多個OkHttpClient實例,因而又對它進行了一層簡單的封裝。

import java.io.IOException; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import com.squareup.okhttp.Callback; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; import com.squareup.okhttp.Response; /** * OKHttp封裝工具類 * * @author wangsong * * 2015-10-9 */ public class OKHttpUtils { private final static OkHttpClient M_OK_HTTP_CLIENT = new OkHttpClient(); static { M_OK_HTTP_CLIENT.setConnectTimeout(30, TimeUnit.SECONDS); } /** * 不開啓異步線程 * * @author wangsong 2015-10-9 * @param request * @return * @throws IOException */ public static Response execute(Request request) throws IOException { return M_OK_HTTP_CLIENT.newCall(request).execute(); } /** * 開啓異步線程訪問,訪問結果自行處理 * * @author wangsong 2015-10-9 * @param request * @param responseCallback */ public static void enqueue(Request request, Callback responseCallback) { M_OK_HTTP_CLIENT.newCall(request).enqueue(responseCallback); } /** * 開啓異步線程訪問,不對訪問結果進行處理 * * @author wangsong 2015-10-9 * @param request * @param responseCallback */ public static void enqueue(Request request) { M_OK_HTTP_CLIENT.newCall(request).enqueue(new Callback() { @Override public void onResponse(Response arg0) throws IOException { } @Override public void onFailure(Request arg0, IOException arg1) { } }); } /** * 爲HttpGet請求拼接一個參數 * * @author wangsong 2015-10-9 * @param url * @param name * @param value */ public static String jointURL(String url, String name, String value) { return url + "?" + name + "=" + value; } /** * 爲HttpGet請求拼接多個參數 * * @author wangsong 2015-10-9 * @param url * @param name * @param value */ public static String jointURL(String url, Map<String, String> values) { StringBuffer result = new StringBuffer(); result.append(url).append("?"); Set<String> keys = values.keySet(); for (String key : keys) { result.append(key).append("=").append(values.get(key)).append("&"); } return result.toString().substring(0, result.toString().length()-1); } }

本文涉及到的工具類下載地址https://github.com/lenve/OKHttpUtils

相關文章
相關標籤/搜索