簡(jiǎn)單說一下學(xué)習(xí)okhttp的理由
- google在Android 6.0中刪除了HttpClient的Api,采用的是則是okhttp
- 高效的使用HTTP,使應(yīng)用運(yùn)行更快更省流量
- 響應(yīng)緩存數(shù)據(jù)避免重復(fù)網(wǎng)絡(luò)請(qǐng)求
- 無(wú)縫的支持GZIP來減少數(shù)據(jù)流量
- 使用非常簡(jiǎn)單,請(qǐng)求和響應(yīng)的Api具有流暢的建造和不變性,同時(shí)支持同步異步調(diào)用回調(diào)函數(shù)
- 如果網(wǎng)絡(luò)出現(xiàn)問題,它會(huì)從常見的連接問題中恢復(fù)
- 如果服務(wù)器配置有多個(gè)IP地址,當(dāng)?shù)谝粋€(gè)IP連接失敗,它會(huì)嘗試連接下一個(gè)IP
以上是okhttp官網(wǎng)http://square.github.io/okhttp/以及結(jié)合網(wǎng)上的一些理解整理出來的,看到有不對(duì)的地方還望大家多多指出
下面我們就開始學(xué)習(xí)怎么使用okhttp吧
配置環(huán)境
github地址:https://github.com/square/okhttp
在builde.gradle里面添加上
compile 'com.squareup.okhttp3:okhttp:3.4.1'
在AndroidManifest.xml添加所需權(quán)限
<uses-permission android:name="android.permission.INTERNET" />
基本使用
- get異步請(qǐng)求
通過get請(qǐng)求獲取指定URL網(wǎng)頁(yè)請(qǐng)求,這里要注意的是Android4.0以后需要在非主線程里使用。
private OkHttpClient client = new OkHttpClient();
public static void get(){
//創(chuàng)建一個(gè)Request
Request request = new Request.Builder()
.url("http://www.lxweimin.com/")
.get()
.build();
//發(fā)起異步請(qǐng)求,并加入回調(diào)
client.newCall(request).enqueue(new Callback()
{
@Override
public void onFailure(Call call,IOException e){
//請(qǐng)求失敗回調(diào)
}
@Override
public void onResponse(Call call,Response response) throws IOException{
//請(qǐng)求成功回調(diào)
Log.e("okHttp","get="+response.body().string());
}
});
}
- post異步請(qǐng)求
private OkHttpClient client = new OkHttpClient();
public static void post(){
//創(chuàng)建Form表單對(duì)象,可以add多個(gè)鍵值隊(duì)
FormBody formBody = new FormBody.Builder()
.add("param","value")
.add("param","value")
.build();
//創(chuàng)建一個(gè)Request
Request request = new Request.Builder()
.url("http://www.lxweimin.com/")
.post(formBody)
.build();
//發(fā)起異步請(qǐng)求,并加入回調(diào)
client.newCall(request).enqueue(new Callback()
{
@Override
public void onFailure(Call call,IOException e){
}
@Override
public void onResponse(Call call,Response response) throws IOException{
Log.e("okHttp","post="+response.body().string());
}
});
}
- 同步請(qǐng)求
把client.newCall(request).enqueue(new Callback())
改成
client.newCall(request).execute().body().string()
即可
- 文件上傳與多文件上傳
public static void upload(){
//多個(gè)文件集合
List<File> list = new ArrayList<>();
MultipartBody.Builder builder = new MultipartBody.Builder();
//設(shè)置為表單類型
builder.setType(MultipartBody.FORM);
//添加表單鍵值
builder.addFormDataPart("param","value");
for (File file : list) {
//添加多個(gè)文件
RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
builder.addFormDataPart("files", file.getName(), fileBody);
}
Request request = new Request.Builder()
.url("http://192.168.1.8/upload/UploadServlet")
.post(builder.build())
.build();
//發(fā)起異步請(qǐng)求,并加入回調(diào)
mOkHttpClient.newCall(request).enqueue(new Callback()
{
@Override
public void onFailure(Call call,IOException e){
}
@Override
public void onResponse(Call call,Response response) throws IOException{
Log.e("okHttp","updLoad="+response.body().string());
}
});
}
- 超時(shí)設(shè)置,整個(gè)程序應(yīng)使用這一個(gè)mOkHttpClient對(duì)象
public static void setTimeout(){
mOkHttpClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)//10秒連接超時(shí)
.writeTimeout(10, TimeUnit.SECONDS)//10m秒寫入超時(shí)
.readTimeout(10, TimeUnit.SECONDS)//10秒讀取超時(shí)
.build();
}
- 文件下載
其實(shí)很簡(jiǎn)單,只需要利用get同步或異步請(qǐng)求,然后通過
client.newCall(request).execute().body().byteStream()
獲取InputStream輸入流,寫文件操作即可實(shí)現(xiàn)文件下載。
好了,學(xué)到這里okhttp算是入門了,其實(shí)還有很多需要我們?nèi)W(xué)習(xí)的,例如緩存、授權(quán)證書、封裝、用的過中碰到的一些情況等等,都需要我們進(jìn)一步的了解和學(xué)習(xí)了,后面有時(shí)間我也會(huì)針對(duì)這些,寫一篇okhttp進(jìn)階篇,還望大家能夠多多關(guān)注。
好記性不如爛筆頭!