okHttp

来源:互联网 发布:cs go 准星数据 编辑:程序博客网 时间:2024/06/03 23:44

okhttp 是支持缓存的。

第一步:我们需要通过单例模式创建实例

private OkHttpManger(){    throw new UnsupportedOperationException("cannot be instantiated");}public static OkHttpClient getClient(){    if (mOkHttpManger == null) {        synchronized (OkHttpManger.class){            if(mOkHttpManger == null){                create();            }        }    }    return mOkHttpManger;}

第二步:涉及到两个拦截操作 

    网络拦截:1)请求拦截一次,返回拦截一次 。一共2次。2)主要用于响应头添加和缓存处理。

    应用拦截:1)只有服务器返回才进行拦截。2)主要用来打印log。


第三步:编写应用拦截

static class AppInterceptor implements Interceptor{    @Override    public Response intercept(Chain chain) throws IOException {        Request request = chain.request();        long t1 = System.nanoTime();        Response response = chain.proceed(request);        //网络响应打印        if(response != null){            long t2 = System.nanoTime();            String responseString = new String(response.body().bytes());            LogUtil.e(TAG,String.format("请求路径: %s", request.url())                    +"\n"+String.format("Access Server in %.1fms ,返回值: %s", (t2 - t1) / 1e6d , responseString));            return response.newBuilder().body(                    ResponseBody.create(response.body().contentType(),                            responseString)).build();        }        return null;    }}

第三步:添加网络拦截

//网络拦截器 2次 添加缓存和公共参数static class NetInterceptor implements Interceptor{    @Override    public Response intercept(Chain chain) throws IOException {        Request request = chain.request();        if(!MyApplication.networkAvailable){            LogUtil.i("use cache data beacause no net");            request = request.newBuilder()                    .cacheControl(CacheControl.FORCE_CACHE)                    .build();        }        Response response = chain.proceed(request);        if(MyApplication.networkAvailable){            String cacheControl = request.cacheControl().toString();            if (TextUtils.isEmpty(cacheControl)) {                //有网络时设置缓存超时时间60s                cacheControl = "public, max-age=60 ,max-stale=2419200";            }            return response.newBuilder()                    .removeHeader("Pragma")                    .removeHeader("Cache-Control")                    .header("Cache-Control", cacheControl)                    .build();        }else {            return response.newBuilder()                    .header("Cache-Control", "public, only-if-cached, max-stale=2419200")                    .removeHeader("Pragma")                    .build();        }    }}

最后一步:我们就把缓存和基本的okhttp设置添加、

private static void create(){    //网络缓存 当没有网络时,可使用缓存    int maxCacheSize = 10 * 1024 * 1024;    File cacheFile = new File(MyApplication.getAppContext().getCacheDir(), "gz_corp");    final Cache cache = new Cache(cacheFile, maxCacheSize);    mOkHttpManger = new OkHttpClient.Builder()            .addNetworkInterceptor(new NetInterceptor())            .addInterceptor(new AppInterceptor())            .retryOnConnectionFailure(true)            .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)            .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)            .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)            .cache(cache)            .build();}

原创粉丝点击