一:OkHttp的介绍
1.什么是OkHttp
OkHttp是一个高效的HTTP库:
1.支持 SPDY ,共享同一个Socket来处理同一个服务器的所有请求
2.如果SPDY不可用,则通过连接池来减少请求延时
3.无缝的支持GZIP来减少数据流量
4.缓存响应数据来减少重复的网络请求
2.OkHttp的优点
OkHttp会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,会自动尝试下一个IP。OkHttp还处理了代理服务器问题和SSL握手失败问题。
使用 OkHttp 无需重写您程序中的网络代码。OkHttp实现了几乎和java.net.HttpURLConnection一样的API。如果您用了 Apache HttpClient,则OkHttp也提供了一个对应的okhttp-apache 模块
二:OkHttp的使用
1.Get请求
get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.readTimeout(1, TimeUnit.MINUTES);
builder.connectTimeout(1,TimeUnit.MINUTES);
OkHttpClient client = builder.build();
Request.Builder builder1 = new Request.Builder();
builder1.url(get_url);
builder1.get();
final Request request = builder1.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("TAG", "onFailure: "+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
ResponseBody body = response.body();
String json = body.string();
Log.i("TAG", "onResponse: "+json);
}
});
}
});
2.POST请求
post.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(1, TimeUnit.MINUTES)
.callTimeout(1, TimeUnit.MINUTES)
.build();
FormBody formBody = new FormBody.Builder()
.add("itemid", "2")
.add("act", "ad_app")
.build();
Request request = new Request.Builder()
.url(post_url)
.post(formBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("TAG", "onFailure: "+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
ResponseBody body = response.body();
Log.i("TAG", "onResponse: "+body.string());
}
});
}
});
3.网络下载数据
load.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(1, TimeUnit.MINUTES)
.callTimeout(1, TimeUnit.MINUTES)
.build();
Request request = new Request.Builder()
.url(download_url)
.get()
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("TAG", "onFailure: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
ResponseBody body = response.body();
long l = body.contentLength();
Log.i("TAG", "onResponse:总大小 "+l);
InputStream inputStream = body.byteStream();
FileOutputStream fileOutputStream = new FileOutputStream("/sdcard/Movies/hz.mp4");
byte[] bytes = new byte[1024];
progressBar.setMax(100);
int len = 0;
int count= 0;
while((len=inputStream.read(bytes))!=-1){
count+=len;
fileOutputStream.write(bytes,0,len);
progressBar.setProgress(count);
Log.i("TAG", "onResponse:当前进度 "+count);
}
}
});
}
});
4.上传数据
unload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(1, TimeUnit.MINUTES)
.callTimeout(1, TimeUnit.MINUTES)
.build();
RequestBody requestBody = RequestBody.create(MediaType.parse("media/map4"), new File("/sdcard/Movies/hz.mp4"));
MultipartBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file","shk.mp4",requestBody)
.build();
Request request = new Request.Builder()
.url("http://169.254.218.199/hfs/")
.post(body)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("TAG", "onResponse:上传成功 ");
}
});
}
});