试听热线:
  029-62258374
网站首页 JavaEE全栈工程师 WEB前端工程师 专家师资 就业案例 常见问题 视频下载 报名流程 关于我们
当前栏目
常见问题
最新文章
Java面试如何描述自己的项
西安尚学堂2019年07月第
2019年Java语言发展趋
西安尚学堂2019年07月第
西安尚学堂2019年07月第
西安尚学堂2019年07月暑
西安尚学堂2019年06月第
西安尚学堂2019年06月第
真实工作中的编程和在学校有何
新手学习Java如何抱好大腿
热门信息
尚学堂学费是多少?
IT培训为什么选择尚学堂
尚学堂四大保障为您保驾护航
张*利,毕业于西安工业大学,
孙*,毕业于陕西能源职业技术
您当前的位置:首页>> android培训教程
西安Java培训Android缓存控制策略
作者:管理员    来源:尚学堂   发布时间:2017-10-31 15:06:10  阅读:496次

Android.jpg


Android Okhttp缓存:精细化每一个Request的CacheControl缓存控制策略(二)



之前我写的附录文章1,只是简单的使用缺省的方法实现Okhttp的缓存。现在使用CacheControl,精细化到每一个Request的缓存控制策略。
改造附录1代码:

[java] view plain copy

  1. package zhangphil.app;  

  2.   

  3. import android.graphics.Bitmap;  

  4. import android.graphics.BitmapFactory;  

  5. import android.os.Bundle;  

  6. import android.support.annotation.Nullable;  

  7. import android.support.v7.app.AppCompatActivity;  

  8. import android.widget.ImageView;  

  9.   

  10. import java.io.File;  

  11. import java.io.IOException;  

  12. import java.util.concurrent.TimeUnit;  

  13.   

  14. import okhttp3.Cache;  

  15. import okhttp3.CacheControl;  

  16. import okhttp3.Call;  

  17. import okhttp3.Callback;  

  18. import okhttp3.OkHttpClient;  

  19. import okhttp3.Request;  

  20. import okhttp3.Response;  

  21.   

  22. public class MainActivity extends AppCompatActivity {  

  23.   

  24.     private OkHttpClient mOkHttpClient;  

  25.   

  26.     @Override  

  27.     public void onCreate(@Nullable Bundle savedInstanceState) {  

  28.         super.onCreate(savedInstanceState);  

  29.         setContentView(R.layout.activity_main);  

  30.         final ImageView image = (ImageView) findViewById(R.id.image);  

  31.   

  32.         File cacheDir = new File(this.getCacheDir(), "zhangphilcache");  

  33.         Cache mCache = new Cache(cacheDir, 8 * 1024 * 1024); //8M缓存空间  

  34.         OkHttpClient.Builder mBuilder = new OkHttpClient.Builder();  

  35.   

  36.         mOkHttpClient = mBuilder  

  37.                 .connectTimeout(10, TimeUnit.SECONDS) //连接超时阈值  

  38.                 .writeTimeout(10, TimeUnit.SECONDS) //写超时阈值  

  39.                 .readTimeout(10, TimeUnit.SECONDS)  //读超时阈值  

  40.                 .retryOnConnectionFailure(true//当失败后重试  

  41.                 .cache(mCache)  

  42.                 .build();  

  43.   

  44.         String url = "https://www.baidu.com/img/bd_logo1.png";  

  45.   

  46.         CacheControl mCacheControl = new CacheControl.Builder()  

  47.                 .noTransform()  

  48.                 .maxAge(60 * 60, TimeUnit.SECONDS) //缓存有效期时长  

  49.                 .build();  

  50.   

  51.         Request mRequest = new Request.Builder()  

  52.                 .url(url)  

  53.                 .cacheControl(mCacheControl)  

  54.                 .build();  

  55.   

  56.         mOkHttpClient.newCall(mRequest).enqueue(new Callback() {  

  57.   

  58.             @Override  

  59.             public void onFailure(Call call, IOException e) {  

  60.   

  61.             }  

  62.   

  63.             @Override  

  64.             public void onResponse(Call call, Response response) throws IOException {  

  65.                 if (response.isSuccessful()) {  

  66.                     byte[] bytes = response.body().bytes();  

  67.                     final Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);  

  68.   

  69.                     runOnUiThread(new Runnable() {  

  70.                         @Override  

  71.                         public void run() {  

  72.                             image.setImageBitmap(bmp);  

  73.                         }  

  74.                     });  

  75.                 }  

  76.             }  

  77.         });  

  78.     }  

  79.   

  80.     @Override  

  81.     protected void onDestroy() {  

  82.         super.onDestroy();  

  83.         //取消所有Okhttp的网络请求  

  84.         mOkHttpClient.dispatcher().cancelAll();  

  85.     }  

  86. }  



maxAge 缓存有效期,Okhttp源代码中maxAge的实现:


[java] view plain copy

  1. /** 

  2.     * Sets the maximum age of a cached response. If the cache response's age exceeds {@code 

  3.     * maxAge}, it will not be used and a network request will be made. 

  4.     * 

  5.     * @param maxAge a non-negative integer. This is stored and transmitted with {@link 

  6.     * TimeUnit#SECONDS} precision; finer precision will be lost. 

  7.     */  

  8.    public Builder maxAge(int maxAge, TimeUnit timeUnit) {  

  9.      if (maxAge < 0throw new IllegalArgumentException("maxAge < 0: " + maxAge);  

  10.      long maxAgeSecondsLong = timeUnit.toSeconds(maxAge);  

  11.      this.maxAgeSeconds = maxAgeSecondsLong > Integer.MAX_VALUE  

  12.          ? Integer.MAX_VALUE  

  13.          : (int) maxAgeSecondsLong;  

  14.      return this;  

  15.    }  




CacheControl.Builder在build时候的常用方法:
noCache 不使用缓存。
noStore 不要把网络数据缓存。
noTransform 不要转码。

Okhttp定义了若干常量缓存模型:
CacheControl.FORCE_NETWORK  强制使用网络数据。
CacheControl.FORCE_CACHE  强制使用缓存。


注意看Okhttp源码实现,在Okhttp源代码文件CacheControl.java中,CacheControl.FORCE_NETWORK的代码实现:


[java] view plain copy

  1. public static final CacheControl FORCE_NETWORK = new Builder().noCache().build();  




CacheControl.FORCE_CACHE的代码实现:


[java] view plain copy

  1. /** 

  2.    * Cache control request directives that uses the cache only, even if the cached response is 

  3.    * stale. If the response isn't available in the cache or requires server validation, the call 

  4.    * will fail with a {@code 504 Unsatisfiable Request}. 

  5.    */  

  6.   public static final CacheControl FORCE_CACHE = new Builder()  

  7.       .onlyIfCached()  

  8.       .maxStale(Integer.MAX_VALUE, TimeUnit.SECONDS)  

  9.       .build();  


尚学堂微信公众号3.png

 
网站首页 | 专家师资 | 常见问题 | 就业案例 | 报名流程 | 联系我们
尚学堂    西安Java培训     Android培训    Java培训教程    Android培训教程    尚学堂怎么样    尚学堂学费    尚学堂视频下载
Copyright 2007 版权所有 西安雁塔尚学堂计算机学校
地址:陕西省西安市高新区科技二路西安软件园天泽大厦五楼 邮编710000 电子邮件:fanchangansxt@163.com
陕ICP备14007859号 咨询电话:029-62258374
在线咨询