转自:https://blog.csdn.net/asdasdasd123123123/article/details/86495240
一、首先介绍下OKhttp的用法
1.添加依赖 compile 'com.squareup.okhttp3:okhttp:3.2.0'
2.创建OkHttpClient对象
OkHttpClient httpClient=new OkHttpClient();
3.创建Request对象
Request request=Request.Builder()
.url("URL")
.builder(); //(get请求)
RequestBody requestBody = new FormBody.Builder()
.add("键", "值")// 构造请求的参数
.add("键", "值")// 构造请求的参数
.build();
Request request=Request.Builder()
.post(requestBody )
.url("URL")
.builder();//(post请求)
4. 添加Request对象到OkHttpClient对象中并执行请求
httpClient.newCall(request).enqueue(new Callback(){
@Override
public void onFailure(Call call, IOException e) {
// 请求失败的处理
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// 请求成功的处理
ResponseBody body = response.body();
String string = body.string();// 把返回的结果转换为String类型
// body.bytes();// 把返回的结果转换为byte数组
// body.byteStream();// 把返回的结果转换为流
handler.post(new Runnable(){
@Override
public void run(){
//在这里执行操作
}
});
Log.d(TAG,string);
}
}); .
okhttp数据执行在子线程中所有使用的时候需要写到handler中回调到主线程,因此请求成功后发送消息
Handler handle=new Handler();
二、因为原生OkHttp的使用比较复杂,有一个包装过的工具项目okhttp-utils使用非常简单
1. 添加依赖: compile 'com.zhy:okhttputils:2.3.8'
OkHttpUtils.get()
.url(URL_GET)
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e) {
//请求失败
textView.setText("get-url请求失败:"+e.getMessage());
}
@Override
public void onResponse(String response) {
//请求成功
textView2.setText("get-url请求成功:"+response);
}
});
OkHttpUtils.post()
.url(URL_POST)
.addParams("键","值")
.addParams("键","值")
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e) {
//请求失败
textView.setText("post-url请求失败:"+e.getMessage());
}
@Override
public void onResponse(String response) {
//请求成功
textView2.setText("post-url请求成功:"+response);
}
});
由此可见两者的区别就不用多说了吧,看代码什么都明白了
说下他们的特点吧:
* 支持HTTP/2 和 SPDY
* 默认支持 GZIP 降低传输内容的大小
* 支持网络请求的缓存
* 当网络出现问题时,自动重试一个主机的多个 IP 地址