3、okhttp网络访问框架使用
一、oKhttp介绍:
1、 OkHttp:Square出品的HTTP请求库
2、Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient。
尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比HttpClient实在是太难用,太弱爆了。
OkHttp是一个相对成熟的解决方案,据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了。所以我们更有理由相信OkHttp的强大。
3、OkHttp 处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP。OkHttp还处理了代理服务器问题和SSL握手失败问题。
4、使用 OkHttp 无需重写您程序中的网络代码。OkHttp实现了几乎和Java.NET.HttpURLConnection一样的API。如果你用了 Apache HttpClient,则OkHttp也提供了一个对应的okhttp-apache模块。
二、使用步骤
1、内部添加依赖;
三、Androidstudio用户 在build.gridle中导入
dependencies {
compile ‘com.squareup.okhttp3:okhttp:3.4.1
}
(2)、Eclipse的用户,可以下载最新的jar okhttphe latest JAR ,添加依赖就可以用了'
2、
(1)对于get请求;
//创建okhttpclient对象
OkHttpClientclient=new OkHttpClient();
//创建一个requese
Requestrequest=new Request.Builder().url(path).build();
//new call
Callcall=client.newCall(request);
//请求调度
call.enqueue(newCallback() {
//请求失败
@Override
public void onFailure(Callcall, IOException e) {
}
//请求成功
@Override
public void onResponse(Callcall, Response response) throws IOException {
//获取网页返回数据
Stringjson=response.body().string();
Log.i("TAG","----->"+json);
}
});
}
(2) 对于post请求
//创建okhttpclient对象
OkHttpClient client=new OkHttpClient();
//创建requestbody
RequestBody requestbody=new FormBody.Builder().
add("key","value").add("","").build();
//创建一个request
Request request=new Request.Builder().url(path).
post(requestbody).build();
//请求调度
client.newCall(request).enqueue(new Callback(){
//失败
@Override
public void onFailure(Callcall, IOException e) {
}
//成功
@Override
public void onResponse(Callcall, Response response) throws IOException {
String json=response.body().string();
Log.i("TAG","~~~~~~~~>"+json);
}
});
(3)进行简单的封装是的post和get方式都能使用(推荐使用第三种)
封装的工具类:okhttputils.class
public class okhttputils {
private okhttputils() {
}
private static okhttputils OK = new okhttputils();
//静态工厂方法
public static okhttputils getInstance() {
return OK;
}
OkHttpClient client = new OkHttpClient();
Call run(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
Call call=client.newCall(request);
// Response response = client.newCall(request).execute();
return call;
}
}
(5)在代码中引用例子
try {
//path:需要访问的网络地址
OkHttpUtils.getInstance().run(path).enqueue(newCallback() {
@Override
public void onFailure(Callcall, IOException e) {
}
@Override
public void onResponse(Callcall, Response response) throws IOException {
String jsonString=response.body().string();
Tuijian_ZuiXintuijian_zuiXin=JSONObject.parseObject(jsonString,Tuijian_ZuiXin.class);
Message message=handler_zuixin.obtainMessage();//用handler传递下载的数据
if (path.endsWith("1")){
message.what=1;
message.obj=tuijian_zuiXin;
handler_zuixin.sendMessage(message);
}else {
message.what=2;
message.obj=tuijian_zuiXin;
handler_zuixin.sendMessage(message);
}
}
});
} catch (IOException e) {
e.printStackTrace();
}
}