標籤:
架構:https://github.com/square/okhttp
今天給大家講解下網路架構okhttp的使用,這個架構非常強大,很多架構都用它來載入網路資源,目前很多開發人員還在用AsyncHttp,這個庫現在已經不推薦使用了,Google已經去掉了httpclient,下面我們就看一下okhttp的使用。
首先在build.gradle檔案中,添加庫並同步,如果是eclipse使用者就要下載jar包匯入libs即可
compile ‘com.squareup.okhttp3:okhttp:3.4.1‘
OkHttpClient httpClient = new OkHttpClient();
Request request = new Request.Builder().url(weather_url).build();
new Thread(){
@Override
public void run() {
super.run();
try {
Response response = httpClient.newCall(request).execute();
final String body = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
setView(body);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
基本使用還是比較簡潔的
//執行個體一個okhttp對象
//建造一個請求參數,這裡可以構造url,head,method等等各種請求參數的設定
//get和post也是在這裡體現的,以上為get請求,預設為null,大家都懂得,看源碼
public Builder get() {
return method("GET", null);
}
注意這裡需要開啟線程發送請求,返回response,然後需要在主線程更新UI
還可以使用回調call這樣請求,但是要注意,這裡僅僅是子線程非同步回調,也就是說更新UI依然要用Handler或者使用runOnUiThread方法。
httpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String body = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
setView(body);
}
});
}
});
以上為get請求的使用,如果是post請求,攜帶參數,僅僅是request構造不同而已,其它一樣,下面是方法:
FormBody.Builder builder = new FormBody.Builder();
builder.add("username","dongcai");
builder.add("e_mail","[email protected]");
FormBody build = builder.build();
final Request request = new Request.Builder().url(weather_url).post(build).build();
這裡要說明的是,post要的參數是RequestBody,這是個抽象類別,裡面封裝支援各種資料表單等,非常強大。我們找到它的實現子類
public final class FormBody extends RequestBody
FormBody 這裡封裝了請求參數集合的方法,需要使用Builder類來添加請求參數,然後構造FormBody對象,發送post請求。在這裡還可以設定編碼方式
public Builder add(String name, String value) {
names.add(HttpUrl.canonicalize(name, FORM_ENCODE_SET, false, false, true, true));
values.add(HttpUrl.canonicalize(value, FORM_ENCODE_SET, false, false, true, true));
return this;
}
public Builder addEncoded(String name, String value) {
names.add(HttpUrl.canonicalize(name, FORM_ENCODE_SET, true, false, true, true));
values.add(HttpUrl.canonicalize(value, FORM_ENCODE_SET, true, false, true, true));
return this;
}
以上是本人蔘考文檔和源碼總結下基本的使用方法,相對於AsyncHttp、volley,恐怕最大的不足就是更新UI,okhttp不太方便,訊息回來需要自己寫主線程。但是okhttp支援SPDY, 可以合并多個到同一個主機的請,使用串連池技術減少請求的延遲(如果SPDY是可用的話) ,使用GZIP壓縮減少傳輸的資料量,緩衝響應避免重複的網路請求、攔截器等等。
Android中okhttp的使用