OkHttp封装

public class OkHttpUtils {


    /**
     *  单例设计模式
     *  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();




        }


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值