一、准备工作
首先把三个和OKhttp请求有关的jar包下载下来并放到工程的libs目录下,下载地址:pan.baidu.com/s/1GhrEeHqi…
二、具体使用方式
1.原始的使用方式
把jar包添加到工程目录后,把下面的httpRequest()复制到Activity中并调用即可。 String date = response.body().string();为获取到的json数据,Constant.SPLASH_URL参数为所要请求数据的URL
public void httpRequest(){
final OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(Constant.SPLASH_URL)
.build();
//开启一个异步请求
client.newCall(request).enqueue(new Callback() {
//请求失败
@Override public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
//有响应
@Override public void onResponse(Call call, Response response) throws IOException {
if(!response.isSuccessful()) {
//请求失败
}
//获取到接口的数据
String date = response.body().string();
//把数据解析,这里的Ads为我们所需要的javaBean对象
Ads ads = JsonUtil.parseJson(date, Ads.class);
}
解析json数据用到的JsonUtil类
public class JsonUtil {
static Gson mGson;
//<T>代表声明使用泛型
//第二个 T 返回的类型是我们使用的类型
//Class<T> 类型.class
public static <T> T parseJson(String json, Class<T> tClass){
if (mGson==null){
mGson = new Gson();
}
if (TextUtils.isEmpty(json)){
return null;
}
return mGson.fromJson(json,tClass);
}
}
2.通过回调的方式
先实现3个类,HttpUtil和泛型类HttpRespon,HttpUtil,JsonUtil代码如下,通过调用HttpUtil的 getDate(String url, final HttpRespon respon)方法来获取数据
public class HttpUtil {
static HttpUtil util;
static OkHttpClient client;
//这个构造方法永远只会被调用一次
private HttpUtil(){
//设置http的超时处理
client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
}
//单例的方法
public static HttpUtil getInstance(){
if (util==null){
synchronized (HttpUtil.class){
if (util==null){
util= new HttpUtil();
}
}
}
return util;
}
//通过调用这个方法来获取数据传入url和respon 两个参数
public void getDate(String url, final HttpRespon respon){
Request request = new Request.Builder()
.url(url)
.build();
//开启一个异步请求
client.newCall(request).enqueue(new Callback() {
//请求失败
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
respon.onError("连接服务器失败");
}
//有响应
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
//请求失败
}
//获取到接口的数据json格式
String date = response.body().string();
respon.prase(date);
}
});
}
}
HttpRespon代码如下
/**
* 回应Http请求的类,回应请求的结果
* *HttpRespon<T>,T的类型要和HttpRespon(Class<T> t) 的类型,以及onSuccess(T t)的类型一致
*
* */
public abstract class HttpRespon<T> {
//http返回的类型的泛型
Class<T> t;
public HttpRespon(Class<T> t){
this.t = t;
}
//请求失败,告诉调用者失败的原因
public abstract void onError(String msg);
//请求成功,http返回需要的类型,把类型传给onSuccess(T t),该方法对数据进行进一步处理
public abstract void onSuccess(T t);
public void prase(String json){
if (TextUtils.isEmpty(json)){
//请求失败
onError("连接网络失败");
return;
}
//如果只需要获取json对象,不用解析
if (t==String.class){
onSuccess((T) json);//json传回去
return;
}
//尝试把json转化为我们需要的类型
T result = JsonUtil.parseJson(json,t);
//转化成功
if (result!=null){
//请求成功
onSuccess(result);//在这里对数据返回的数据进行进一步处理
}else{
onError("json解析失败");
}
}
}
HttpRespon中prase(String json)方法所用到的JsonUtil类代码如下
public class JsonUtil {
static Gson mGson;
//<T>代表声明使用泛型
//第二个 T 返回的类型是我们使用的类型
//Class<T> 类型.class
public static <T> T parseJson(String json, Class<T> tClass){
if (mGson==null){
mGson = new Gson();
}
if (TextUtils.isEmpty(json)){
return null;
}
return mGson.fromJson(json,tClass);
}
}
调用调用HttpUtil的 getDate(String url, final HttpRespon respon)方法,实现HttpRespon抽象类中的两个抽象方法即可获取到数据
HttpUtil util = HttpUtil.getInstance();
//这里的url为我们所要请求的url接口
String url = Constant.URL
util.getDate(url, new HttpRespon<Hot>(Hot.class) {
@Override
public void onError(String msg) {
}
@Override
public void onSuccess(Hot hot) {
//这里的Hot类是根据json数据进行封装的,具体命名由自己来定
});
这里的Hot类所要解析的javaBean类,即把json数据转换为Hot类对象,这里的Hot类由自己根据所请求的json数据进行封装,不一定命名为Hot,具体命名由自己来定。若不想解析,想要得要原始的Json数据,则把Hot改为String即
HttpUtil util = HttpUtil.getInstance();
//这里的url为我们所要请求的url接口
String url = Constant.URL
util.getDate(url, new HttpRespon<String>(String.class) {
@Override
public void onError(String msg) {
}
@Override
public void onSuccess(String json) {
//这里的json就是原始的数据
});