1、定义OKHttp的客户端,并设置一些常用属性
OkHttpClient mOKHttpClient;
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(15, TimeUnit.SECONDS); //设置连接超时时间
File sdcachedir = context.getApplicationContext().getExternalCacheDir();
int cachesize = 10 * 1024 * 1024;
builder.cache(new Cache(sdcachedir,cachesize)); //设置缓存区域大小
mOKHttpClient = builder.build();
2、封装异步获取get请求的方法
public void getDataSynce(@NonNull String url, final ResultCallBack resultCallBack){
final Request request = new Request.Builder()
.url(url)
.build(); //构建一个请求体
Call call = mOKHttpClient.newCall(request); //建立一个会话
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
if(resultCallBack!=null){
resultCallBack.onError(request,e);
}
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
if(resultCallBack!=null){
resultCallBack.onResponse(response);
}
}
});
}
3、上面的ResultCallBack 是我们自己定义的接口
public interface ResultCallBack {
public void onError(Request request,Exception e);
public void onResponse(Response response);
}
4、在回调接口中去解析OKHttp返回的数据,利用Gson解析会比较方便快捷。这里的DailyEntity就是我们要反序列化后得到的结果类。
private ResultCallBack resultCallBack = new ResultCallBack() {
Gson gson;
@Override
public void onError(Request request, Exception e) {
//请求失败的提示操作
}
@Override
public void onResponse(Response response) {
if(gson == null) gson = new Gson();
DailyEntity mDailyEntity = null;
try {
mDailyEntity = gson.fromJson(response.body().string(),DailyEntity.class);
Log.i(TAG,"response body:"+response.body().string()); //这里打印为null
} catch (IOException e) {
e.printStackTrace();
return;
}
if(mDailyEntity == null){
Log.i(TAG,"mDailyEntity is null");
return;
}
handler.post(new Runnable() {
@Override
public void run() {
view.updateData(mDailyEntity );
}
});
}
需要注意的是:
- OKHttp的返回方法调用,还是在网络线程里面,所以想要更新UI的操作,注意需要切换线程到主线程。
- Response.body().string()这个方法,只能调用一次。一旦调用之后,返回的数据流就会被读出来,第二次去获取,就没有数据流了。