为什么要用cache?

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

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

HttpResponseCache的好处:

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

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

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

public class HttpCacheApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
new Thread() {
@Override
public void run() {
enableHttpResponseCache();
}
}.start();
} private void enableHttpResponseCache() {
try {
long httpCacheSize = 10 * 1024 * 1024;// 10M
File 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;
@Override
public 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() {
@Override
public void onClick(View v) {
new InternetTask().execute();
}
});
findViewById(R.id.button2).setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
MainActivity.this.finish();
}
});
} class InternetTask extends AsyncTask<String, String, Boolean> {
Bitmap bitmap;
String jsonStr; @Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
img.setImageBitmap(bitmap);
tv.setText(jsonStr);
} @Override
protected Boolean doInBackground(String... params) {
// Test download image
try {
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 data
try {
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卸载的时候被清除。

HttpResponseCache的使用缓存cache的更多相关文章

  1. POCO库——Foundation组件之缓存Cache

    缓存Cache:内部提供多种缓存Cache机制,并对不同机制的管理缓存策略不同实现: ValidArgs.h :ValidArgs有效键参数类,模板参数实现,_key:键,_isValid:是否有效, ...

  2. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

  3. [.net 面向对象程序设计进阶] (14) 缓存(Cache) (一) 认识缓存技术

    [.net 面向对象程序设计进阶] (14) 缓存(Cache)(一) 认识缓存技术 本节导读: 缓存(Cache)是一种用空间换时间的技术,在.NET程序设计中合理利用,可以极大的提高程序的运行效率 ...

  4. .Net自带缓存Cache的使用

    对于数据比较大,经常要从数据库拿出来用的,可以考虑使用.Net自带的缓存Cache,简单好用: //向内存中插入一个缓存 System.Web.HttpRuntime.Cache.Insert(&qu ...

  5. 缓存Cache

    转载自  博客futan 这篇文章将全面介绍有关 缓存 ( 互动百科 | 维基百科 )cache以及利用PHP写缓存caching的技术. 什么是缓存Cache? 为什么人们要使用它? 缓存 Cach ...

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

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

  7. Java 中常用缓存Cache机制的实现《二》

    所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. AD: Cache 所谓缓存,就是将程序或系统经常要 ...

  8. YII缓存Cache

    缓存Cache 定义:将数据暂时存放在一个存储速度更快的介质上,下次读取数据时就可以从这个介质上来读取数据 介质:内存.文件.数据库(优化好的数据库) Yii缓存的分类:(framework/cach ...

  9. ASP.NET缓存 Cache

    缓存介绍 如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差,而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能,这样无论多 ...

随机推荐

  1. [转]阮一峰:理解RESTful架构

    作者: 阮一峰 日期: 2011年9月12日 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通 ...

  2. Maven(3)-利用intellij idea创建maven web项目

    本文通过一个例子来介绍利用maven来构建一个web项目.开发工具:intellij idea. 一.新建maven项目 此处选择:Create from archetype.表示从已有的maven模 ...

  3. POJ3126Prime Path(BFS)

    #include"cstdio" #include"queue" #include"cstring" using namespace std ...

  4. Nmap几个常用的参数

    Nmap扫描端口的6种状态: open:端口是开放的 closed:端口是关闭的 filtered:端口被防火墙IDS/IPS屏蔽,无法确定其状态 unfiltered:端口没有被屏蔽,但要进一步确定 ...

  5. Android Studio的Android Monitor窗口中把标签拉出来之后放不回去的解决方法

    不小心把下图方框中的logcat标签拖出来之后, 就变成了图2的浮动窗口,发现logcat标签怎么也弄不回原来窗口中的位置中. 其实解决方法很简单,只要拖住下图浮动窗口中红框位置的logcat标签,然 ...

  6. List for game to play latter

    1.The Elder Scrolls V 2.Border Lands 1,2 3.Mind Killer 4.Dark Soul 2 5.Watch Dog 6.Valkyria Chronicl ...

  7. Add lombok to IntelliJ IDEA

    Lombok study link: https://www.jianshu.com/p/365ea41b3573 Add below dependency code to pom.xml <d ...

  8. 12、geo数据上传

    1.注册一个NCBI账户 注册geo账户(老用户和新用户): https://www.ncbi.nlm.nih.gov/geo/submitter/ 有3个月的时间 GEO DataSets > ...

  9. p2590&bzoj1036 树的统计

    传送门(洛谷) 传送门(bzoj) 题目 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值 ...

  10. IDEA如何启动debug?

    选择remote,然后,修改host和port: host是我们访问backstop的ip,端口是监听端口8787,点击ok即可. 打断点,调试,即可.