android OKHTTP 的缓存问题

来源:互联网 发布:移动2g网络可以上网吗 编辑:程序博客网 时间:2024/05/20 01:09

了解OKHTTP的缓存 可有助于我们使用retrofit picasso 等配合okhttp使用的框架。

okhttp中的缓存主要要在两个地方配置:

第一,在构造okhttpclient时 设置缓存路径

第二,在构造request时 配置缓存策略


一、缓存路径

OkHttpClient client = new OkHttpClient.Builder()                  .connectTimeout(5, TimeUnit.SECONDS)                  .cache(new Cache(new File(this.getExternalCacheDir(), "okhttpcache"), 10 * 1024 * 1024))                  .build(); 
从方法.cache ()可知,我们设置的应用路径为“~/mnt/sdcard/Android/data/应用包名/cache/okhttpcache”  最大缓存容量是10M 超过10M时会自动删除已缓存的数据。当没有网络连接时,会自动加载缓存中的数据。很方便。

发起网络请求 如下:

Request request = new Request.Builder().url("http://www.tngou.net/api/food/list?id=1").build();  client.newCall(request).enqueue(new Callback() {      @Override      public void onFailure(Call call, IOException e) {        }        @Override      public void onResponse(Call call, Response response) throws IOException {          if (response.isSuccessful()) {                     *********        }      }  });  
网络请求完后 可以在前面设置的目录下看到三个文件,如图

其中以.0结尾的文件缓存了http的响应头信息,以.1结尾的文件则缓存了我们下载的json数据,journal则是一个日志文件

这个时候如果关闭网络再去请求网络数据,就会直接从缓存中读取数据了。

二、缓存策略

配置缓存策略就是在构造request时,设置CacheControl, CacheControl有两种配置方式:

第一:构造CacheControl

CacheControl cc = new CacheControl.Builder()                  //不使用缓存,但是会保存缓存数据                  //.noCache()                  //不使用缓存,同时也不保存缓存数据                 // .noStore()                  //只使用缓存,(如果我们要加载的数据本身就是本地数据时,可以使用这个,不过目前尚未发现使用场景)                  //.onlyIfCached()                  //手机可以接收响应时间小于当前时间加上10s的响应  //                .minFresh(10,TimeUnit.SECONDS)                  //手机可以接收有效期不大于10s的响应  //                .maxAge(10,TimeUnit.SECONDS)                  //手机可以接收超出5s的响应                  .maxStale(5,TimeUnit.SECONDS)                  .build();          Request request = new Request.Builder()                  .cacheControl(cc)                  .url("http://192.168.152.2:8080/cache").build();  
第二:使用cachecontrol中的常量

 Request request = new Request.Builder()                  //强制使用网络  //                .cacheControl(CacheControl.FORCE_NETWORK)                  //强制使用缓存                  .cacheControl(CacheControl.FORCE_CACHE)                  .url("http://192.168.152.2:8080/cache").build();

到此。


0 0
原创粉丝点击