框架下載地址:https://github.com/square/okhttp
今天給大家講解下網(wǎng)絡框架okhttp的使用,這個框架非常強大疏咐,很多框架都用它來加載網(wǎng)絡資源,目前很多開發(fā)者還在用AsyncHttp拓瞪,這個庫現(xiàn)在已經(jīng)不推薦使用了优妙,Google已經(jīng)去掉了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對象
//建造一個請求參數(shù)霹疫,這里可以構造url拱绑,head,method等等各種請求參數(shù)的設置
//get和post也是在這里體現(xiàn)的丽蝎,以上為get請求猎拨,默認為null,大家都懂得屠阻,看源碼
public?Builder?get()?{
return?method("GET",?null);
}
注意這里需要開啟線程發(fā)送請求迟几,返回response,然后需要在主線程更新UI
還可以使用回調(diào)call這樣請求栏笆,但是要注意,這里僅僅是子線程異步的回調(diào)臊泰,也就是說更新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請求缸逃,攜帶參數(shù)针饥,僅僅是request構造不同而已,其它一樣需频,下面是方法:
FormBody.Builder?builder?=?new?FormBody.Builder();
builder.add("username","dongcai");
builder.add("e_mail","lidongcaiocc@163.com");
FormBody?build?=?builder.build();
final?Request?request?=?new?Request.Builder().url(weather_url).post(build).build();
這里要說明的是丁眼,post要的參數(shù)是RequestBody,這是個抽象類昭殉,里面封裝支持各種數(shù)據(jù)表單等苞七,非常強大藐守。我們找到它的實現(xiàn)子類
public?final?class?FormBody?extends?RequestBody
FormBody?這里封裝了請求參數(shù)集合的方法,需要使用Builder類來添加請求參數(shù)蹂风,然后構造FormBody對象卢厂,發(fā)送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壓縮減少傳輸?shù)臄?shù)據(jù)量,緩存響應避免重復的網(wǎng)絡請求棚品、攔截器等等靠欢。
本文出自微信公眾號mjw-java,更多內(nèi)容歡迎關注微信公眾號或訪問網(wǎng)站www.moliying.com