HttpResponseCache的使用缓存cache
为什么要用cache?
我们可以通过传递类似上次更新时间这样的参数来制定查询某些数据。同样,在下载图片的时候,server那边最好能够减少图片的大小,而不是让我们下载完整大小的图片。
之前我们在软件开发中,cache都是自己来写,不管是图片缓存还是其他从网络获取的数据,有了HttpResponseCache,它帮助我们可以很好的解决cache这个问题(我现在感觉他只适合cache一些小的数据,如果大量的图片cache还是自己缓存到SD卡上面去比较好)。
HttpResponseCache的好处:
- 明显一点节约电,减少了网络请求。
- 开发者不用自己在去写cache机制了。
- 最根本的一点就是,如果开发者在开发中不是使用的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的更多相关文章
- POCO库——Foundation组件之缓存Cache
缓存Cache:内部提供多种缓存Cache机制,并对不同机制的管理缓存策略不同实现: ValidArgs.h :ValidArgs有效键参数类,模板参数实现,_key:键,_isValid:是否有效, ...
- [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能
[.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...
- [.net 面向对象程序设计进阶] (14) 缓存(Cache) (一) 认识缓存技术
[.net 面向对象程序设计进阶] (14) 缓存(Cache)(一) 认识缓存技术 本节导读: 缓存(Cache)是一种用空间换时间的技术,在.NET程序设计中合理利用,可以极大的提高程序的运行效率 ...
- .Net自带缓存Cache的使用
对于数据比较大,经常要从数据库拿出来用的,可以考虑使用.Net自带的缓存Cache,简单好用: //向内存中插入一个缓存 System.Web.HttpRuntime.Cache.Insert(&qu ...
- 缓存Cache
转载自 博客futan 这篇文章将全面介绍有关 缓存 ( 互动百科 | 维基百科 )cache以及利用PHP写缓存caching的技术. 什么是缓存Cache? 为什么人们要使用它? 缓存 Cach ...
- Java 中常用缓存Cache机制的实现
所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 所谓缓存,就是将程序或系统经常要调用的对象存在内存中 ...
- Java 中常用缓存Cache机制的实现《二》
所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. AD: Cache 所谓缓存,就是将程序或系统经常要 ...
- YII缓存Cache
缓存Cache 定义:将数据暂时存放在一个存储速度更快的介质上,下次读取数据时就可以从这个介质上来读取数据 介质:内存.文件.数据库(优化好的数据库) Yii缓存的分类:(framework/cach ...
- ASP.NET缓存 Cache
缓存介绍 如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差,而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能,这样无论多 ...
随机推荐
- c++11中用_sntprintf代替_stprintf
sprintf.swprintf 分别是对单字节/双字节字符格式化的,wsprintf根据预定义指示符的不同可以对单字节/双字节字符格式化. wsprintf和swprintf比较,其实这两个函数对用 ...
- nefu阶乘定理
Description 小明的爸爸从外面旅游回来给她带来了一个礼物,小明高兴地跑回自己的房间,拆开一看是一个很大棋盘(非常大),小明有所失望.不过没过几天发现了大棋盘的好玩之处.从起点(0,0)走到终 ...
- JVM插庄之一:JVM字节码增强技术介绍及入门示例
字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...
- zk 02之 Windows安装和使用zookeeper
本文介绍的 Zookeeper 是以 3.4.5 这个稳定版本为基础,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取,Zookeeper 的安装非 ...
- RS-485半双工延时问题
学习485总线时,遇到延时问题,困扰很久.通过学习知道了485半双工收发时必须延时,以保证系统的稳定性.可靠性.好多资料都介绍了485 防静电.抗干扰电路.惟独没提 每一帧收发停止位(或第9位)的延时 ...
- telnet IP:ERROR
实验环境:CentOS6.8 主机:172.16.xxx.xxx:80 客户端:172.16.xxx.xxx [root@www ~18:32:27]#telnet 172.16.xxx.xxx 80 ...
- java基础知识(10)---包
包:定义包用package关键字. 1:对类文件进行分类管理. 2:给类文件提供多层名称空间. 如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中 ...
- HTML DOM clearTimeout() 方法
转自:http://www.w3school.com.cn/jsref/met_win_cleartimeout.asp 定义和用法 clearTimeout() 方法可取消由 setTimeout( ...
- ansible应用案例-一键安装flask
一.添加主机 sudo vim /etc/ansible/hosts ------------------------------------------------------> [group ...
- 【总结整理】关于Json的解析,校验和验证
var jasondata='{"staff": [{"name":"红旗","age":90}, {"nam ...