/**
* 单例设计模式
* 1、构造函数私有化
* 2、提供一个公有的、静态、返回值类型是当前类的对象的方法
*/
private static OkHttpUtils okHttpUtils;
private OkHttpClient okHttpClient;//单例OKhttpClient对象的好处:1、避免重复创建销毁对象造成内存开销 2、OKhttp的高并发的优点没有被发挥出来
private OkHttpUtils(){
//如果服务器响应头包含Cache-Control:max-age=600 就代表后台服务器支持缓存
//如果后台支持缓存 只需要给OKhttp设置一个缓存路径就可以了
Interceptor interceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();//拦截Request对象
Log.d("OkHttpUtils", "request.url():" + request.url());
Response response = chain.proceed(request);//获取服务器响应
//获取到响应头的内容是否为空
if (TextUtils.isEmpty(response.cacheControl().toString())){
int time = 0;
//判断是否有网络 如果有网络就加载网络数据 没有网络就加载缓存数据
if (isNetworkAvailable()){
time = 0;
}else {
time = 60 * 60 * 24 * 365;
}
//生成新的response对象 往新的对象中手动添加Cache-Control 让其支持缓存
Response newReponse = response.newBuilder().addHeader("Cache-Control", "max-age="+time).build();
return newReponse;
}
// Headers headers = response.headers();//获取服务器所有响应头
// Set<String> names = headers.names();//获取响应头的key
// for (String name: names)//遍历key 得到value
// Log.d("OkHttpUtils", name + ":" + headers.get(name));
return response;
}
};
// HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(HttpLoggingInterceptor.Logger.DEFAULT);
// loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
Cache cache = new Cache(App.context.getCacheDir(),1024*1024*10);
okHttpClient = new OkHttpClient.Builder().cache(cache).addNetworkInterceptor(interceptor).build();
}
/**
* 懒汉式
* @return
*/
public static OkHttpUtils getInstance(){
if(okHttpUtils == null)
okHttpUtils = new OkHttpUtils();
return okHttpUtils;
}
/**
* 无参的get请求
* @param url 接口地址
*/
public void doGet(String url, final MyNetworkCallback callback) {
Request request = new Request.Builder().url(url).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callback.onError(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Headers headers = response.headers();
Set<String> names = headers.names();
for (String name : names){
Log.i("aaa",name+":"+headers.get(name));
}
callback.onSuccess(response.body().string());
}
});
}
/**
* 有参的get请求
* @param url 接口地址
* @param params 参数列表
*/
public void doGet(String url, Map<String,String> params, final MyNetworkCallback callback){
//做非空判断 增强程序的健壮性
if (params != null && params.size() > 0){
//获取map集合中所有key
Set<String> keys = params.keySet();
StringBuffer sb = new StringBuffer(url);
// url = url + "?";
sb.append("?");
//遍历所有key
for (String key : keys) {
String value = params.get(key);
// url = url + key + "=" + value + "&";
sb.append(key).append("=").append(value).append("&");
}
url = sb.deleteCharAt(sb.length()-1).toString();
}