为什么要用cache?

我们可以通过传递类似上次更新时间这样的参数来制定查询某些数据。同样,在下载图片的时候,server那边最好能够减少图片的大小,而不是让我们下载完整大小的图片。

之前我们在软件开发中,cache都是自己来写,不管是图片缓存还是其他从网络获取的数据,有了HttpResponseCache,它帮助我们可以很好的解决cache这个问题(我现在感觉他只适合cache一些小的数据,如果大量的图片cache还是自己缓存到SD卡上面去比较好)。

HttpResponseCache的好处:

  1. 明显一点节约电,减少了网络请求。
  2. 开发者不用自己在去写cache机制了。
  3. 最根本的一点就是,如果开发者在开发中不是使用的HttpClient, HttpDefaultClient..., 而是用 HttpURLConnection的话, 你根本不用改本來的 Code。

这个我们就不多说了,直接看示例:

在开发中你不用写其他任何东西,只要在Application层将其启动就好了 其他的全部交给HttpURLConnection处理就行。

public class HttpCacheApplication extends Application {@Overridepublic void onCreate() {super.onCreate();new Thread() {@Overridepublic void run() {enableHttpResponseCache();}}.start();}private void enableHttpResponseCache() {try {long httpCacheSize = 10 * 1024 * 1024;// 10MFile httpCacheDir = new File(getCacheDir(), "http");Class.forName("android.net.http.HttpResponseCache").getMethod("install", File.class, long.class).invoke(null, httpCacheDir, httpCacheSize);} catch (Exception e) {Log.e("===>", e.getMessage(), e);}}}

接下来我们来看看HttpUrlConnection是怎么处理的,怎么缓存的。

public class MainActivity extends Activity {private final String TAG = getClass().getSimpleName();ImageView img;Button msg;TextView tv;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);img = (ImageView) findViewById(R.id.imageView1);tv = (TextView)findViewById(R.id.textView1);msg = (Button) findViewById(R.id.button1);msg.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {new InternetTask().execute();}});findViewById(R.id.button2).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {MainActivity.this.finish();}});}class InternetTask extends AsyncTask<String, String, Boolean> {Bitmap bitmap;String jsonStr;@Overrideprotected void onPostExecute(Boolean result) {super.onPostExecute(result);img.setImageBitmap(bitmap);tv.setText(jsonStr);}@Overrideprotected Boolean doInBackground(String... params) {// Test download imagetry {URL url = new URL("http://news.baidu.com/resource/img/logo_news_137_46.png");HttpURLConnection conn = (HttpURLConnection) (url.openConnection());conn.connect();InputStream is = conn.getInputStream();BitmapFactory.Options ops = new BitmapFactory.Options();bitmap = BitmapFactory.decodeStream(is, null, ops);is.close();conn.disconnect(); } catch (Exception e) {Log.e(TAG, e.getMessage(), e);}// Test download JSON datatry {URL url = new URL("http://www.baidu.com/");HttpURLConnection conn = (HttpURLConnection) (url.openConnection());conn.connect();  BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));jsonStr = reader.readLine();InputStream is = conn.getInputStream();is.close();conn.disconnect();} catch (Exception e) {Log.e(TAG, e.getMessage(), e);}return true;}}}

我们看下效果:

看下缓存文件,每个文件会产生两个文件,一个是数据文件,一个是http header 信息

 Cache Files Locally [缓存文件到本地]

  • 避免下载重复的数据是很重要的。可以使用缓存机制来处理这个问题。缓存static的资源,例如完整的图片。这些缓存的资源需要分开存放。
  • 为了保证app不会因为缓存而导致显示的是旧数据,请从缓存中获取最新的数据,当数据过期的时候,会提示进行刷新。
long currentTime = System.currentTimeMillis());  HttpURLConnection conn = (HttpURLConnection) url.openConnection();  long expires = conn.getHeaderFieldDate("Expires", currentTime);
long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime);  setDataExpirationDate(expires);  if (lastModified < lastUpdateTime) {  // Skip update
} else {  // Parse update
}  

使用这种方法,可以有效保证缓存里面一直是最新的数据。可以使用下面的方法来获取外部缓存的目录:

Context.getExternalCacheDir();

下面是获取内部缓存的方法,请注意,存放在内存中的数据有可能因内部空间不够而被清除。

Context.getCache();

不管是存放在哪里的文件都会在app卸载的时候被清除。

转载于:https://www.cnblogs.com/mingfeng002/p/3493778.html

HttpResponseCache的使用缓存cache相关推荐

  1. Java 中常用缓存Cache机制的实现

    /* *所谓缓存,就是将程序或系统经常要调用的对象存在内存中,以便其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. *内存缓存,也就是实现一个类中静态Map,对 ...

  2. php smarty安装,php smarty 安装 、配置、使用 及缓存cache的配置使用

    cache 使用: cache配置: $smarty->cache_dir = "/caches/";  //缓存目录 $smarty->caching = true; ...

  3. 转载:缓存 Cache

    /// <summary>         /// 缓存函数         /// </summary>         /// <param name="p ...

  4. 计算机缓存Cache机制理解

    1.计算机存储体系简介 存储器是分层次的,离CPU越近的存储器,速度越快,每字节的成本越高,同时容量也因此越小.寄存器速度最快,离CPU最近,成本最高,所以个数容量有限,其次是高速缓存(缓存也是分级, ...

  5. java cacheutil_Java 常用缓存Cache机制的实现

    所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类:一.通过文件缓存,顾名思义文件 ...

  6. tp5缓存在html怎么用,tp5.1缓存Cache的使用

    前言:一般分类基本不会动,所以我们在分类当中加入缓存 1.控制器use use think\facade\Cache; 2.存取缓存 public function index() { if (Cac ...

  7. asp.net 应用数据缓存 -- Cache对象使用

    ASP.NET 应用数据缓存 -- Cache对象使用 [原文:http://msdn.microsoft.com/zh-cn/library/18c1wd61%28v=vs.100%29.aspx] ...

  8. ASP.NET状缓存Cache的应用-提高数据库读取速度

    ASP.NET状缓存Cache的应用-提高数据库读取速度 原文:ASP.NET状缓存Cache的应用-提高数据库读取速度 一. Cache概述        既然缓存中的数据其实是来自数据库的,那么缓 ...

  9. ASP.NET 缓存 Cache

    ASP.NET 提供一个功能完整的缓存引擎,页面可使用该引擎通过 HTTP 请求存储和检索任意对象. 缓存的生存期与应用程序的生存期相同,也就是说,当应用程序重新启动时,将重新创建缓存. 将数据添加到 ...

最新文章

  1. 运维工作钱少、事多而且杂?年轻人,你这个思想很危险吶
  2. OVS+Docker
  3. 程序员大佬的简历和普通程序员有啥区别?
  4. [PHP语法]PHP基础语法与数据类型
  5. 【计算机组成原理】控制器
  6. 【Python系列】之2:列表和元组
  7. 统计Linux服务器连接数
  8. 开学倒计时,实验室里的这些准备工作你做完了吗?-LIMS2
  9. matlab c1083,致命錯誤C1083:不能打開包含文件:'mexutils。沒有這樣的文件或目錄。...
  10. 优化机场值机体验之护照阅读器
  11. (WIP)Start my first kernel journey (by quqi99)
  12. fx3u4ad一adp说明书_三菱PLC模块FX3U-4AD与FX3U-4AD-ADP的区别
  13. 前端:解决vue2.0只能运行在Local,不能运行在NetWork的问题
  14. Photoshop脚本 压缩并输出GIF图片
  15. oracle公共同义词查找,[Oracle]同义词(synonym)
  16. 2021-WWW-Learning Intents behind Interactions with Knowledge Graph for Recommendation
  17. 应用程序无法正常启动(0xc000007b)解决
  18. 初学者学习深度学习,不得不会的Google Colab基本操作
  19. Android开发笔记:关于SeekBar在刷新使用中的一些问题
  20. 使用抓包工具下载有下载限制的视频

热门文章

  1. 代码审查工具StyleCop
  2. Linux下调试python
  3. 【Python-ML】SKlearn库密度聚类DBSCAN模型
  4. 【正一专栏】俄罗斯世界杯来了——抽签概述
  5. Windows环境下32位汇编程序设计C版code--第五章(三)
  6. group by rollup 变量名为空值_【Python学习笔记】07、数据类型和变量
  7. Mac 技术篇-mac远程桌面直接连接windows系统,微软官方工具Microsoft Remote Desktop远程桌面工具安装与使用
  8. Python 微信机器人-用itchat库向好友发送名片、转发名片实例演示
  9. Python 入门篇-用Notepad++编写出第一个python程序
  10. 霍尔传感器测量转向的方法