拦截器,判断是否有网络实现细节

package com.jiyun.a08c;




import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.text.TextUtils;
import android.util.Log;
import android.widget.ImageView;


import com.bumptech.glide.Glide;


import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Set;


import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;


/**
 * Created by xingge on 2018/3/2.
 * okhttp的工具类
 *
 * 拦截器:1、应用拦截器 2、网络拦截器
 * 应用拦截器通常用于日志信息输出  addInterceptor
 * 网络拦截器可以改变请求和响应 addNetworkInterceptor
 * 应用场景:给OKhttp添加缓存
 * 1、服务器支持缓存(只需要给OKhttpClient对象设置一个缓存对象Cache)
 * 2、服务器不支持缓存 还需要给响应头手动添加一个header:Cache-Control  max-age=600代表缓存的有效期 单位:秒
 *
 * 怎么判断一个服务器是否支持缓存:就看服务器的响应头是否包含Cache-Control  如果包含就支持 不包含代表不支持
 */


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 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 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 params, final MyNetworkCallback callback){


        //做非空判断 增强程序的健壮性
        if (params != null && params.size() > 0){


            //获取map集合中所有key
            Set 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();




        }


        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 {


                callback.onSuccess(response.body().string());
            }
        });


    }






    /**
     * 有参的get请求
     * @param url 接口地址
     * @param params 参数列表
     */
    public void doPost(String url, Map params,final MyNetworkCallback callback){
        FormBody.Builder builder = new FormBody.Builder();
        if (params != null && params.size() > 0){
            Set keySet = params.keySet();
            for (String key : keySet) {
                String value = params.get(key);
                builder.add(key,value);


            }
        }
        FormBody formBody = builder.build();
        Request request = new Request.Builder().url(url).post(formBody).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 {
                callback.onSuccess(response.body().string());
            }
        });


    }


    /**
     * 加载图片
     * @param imgUrl 图片地址
     * @param imageView 要显示图片的ImageView
     */
    public void loadImg(String imgUrl, ImageView imageView){
        Glide.with(App.context).load(imgUrl).into(imageView);
    }

//判断当前网络是否可用
    public boolean isNetworkAvailable() {


        ConnectivityManager manager = (ConnectivityManager) App.context
                .getApplicationContext().getSystemService(
                        Context.CONNECTIVITY_SERVICE);


        if (manager == null) {
            return false;
        }


        NetworkInfo networkinfo = manager.getActiveNetworkInfo();


        if (networkinfo == null || !networkinfo.isAvailable()) {
            return false;
        }


        return true;
    }


}

你可能感兴趣的:(拦截器,判断是否有网络实现细节)