[Android Traffic] 使用缓存来避免重复的下载
2024-09-13 21:32:26
转载自: http://blog.csdn.net/kesenhoo/article/details/7395817
Redundant Downloads are Redundant[重复下载是冗余的]
- 减少下载的最基本方法是仅仅下载那些你需要的[美国人的思维还是比较直接,虽然这句话看起来比较搞笑,但是很有道理]。从数据的角度看,我们可以通过传递类似上次更新时间这样的参数来制定查询某些数据。
- 同样,在下载图片的时候,server那边最好能够减少图片的大小,而不是让我们下载完整大小的图片。
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卸载的时候被清除。
Use the HttpURLConnection Response Cache[使用HttpURLConnection Response缓存]
- 在Android 4.0里面为HttpURLConnection增加了一个response cache,我们可以使用反射机制开启HTTP response cache,看下面的例子:
private void enableHttpResponseCache() {
try {
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
File httpCacheDir = new File(getCacheDir(), "http");
Class.forName("android.net.http.HttpResponseCache")
.getMethod("install", File.class, long.class)
.invoke(null, httpCacheDir, httpCacheSize);
} catch (Exception httpResponseCacheNotAvailable) {
Log.d(TAG, "HTTP response cache is unavailable.");
}
}
- 上面的sample code会在Android 4.0以上的设备上开启response cache,同时不会影响到之前的程序。
- 在cache被开启之后,所有cache中的HTTP请求都可以直接在本地存储中进行响应,并不需要开启一个新的网络连接。
- 被cache起来的response可以被server所确保没有过期,这样就减少了带宽。没有被cached的response会因方便下次请求而被存储在response cache中。
后记:Cache机制在很多实际项目上都有使用到,实际操作会复杂许多,有机会希望能够分享一个Cache的实例。
学习自:http://developer.android.com/training/efficient-downloads/redundant_redundant.html,谢谢!
转载请注明出处:http://blog.csdn.net/kesenhoo,谢谢!
最新文章
- 【转】Linux重定向操作符
- silverlight Canvas、StackPanel、Grid三者之间的关系
- 微信公众平台回复过了怎么不能再次回复?亲们要注意查看";公众平台回复用户消息时限变更通知";的公告啊
- Oracle数据库中实现mysql数据库中auto-increment功能
- C++函数默认参数
- 转载 GUID介绍
- MySqlCommand, MySqlParameter and ";LIKE"; with Percent Symbol
- CLR读书笔记——委托
- php中urldecode()和urlencode()起什么作用啊
- 听说https更安全
- mvc后台上传
- Docker: docker image常用命令实战
- 【vue】使用el-table时,实现批量选中效果
- 用socket发送信息在浏览器上显示出来
- GDB 调试解析
- APICloud-端JS库功能API文档(1)
- 消息系统之Apache ActiveMQ
- Windows10更改网络类型-公用-专用
- nginx+php-fpm 配置和错误总结
- numpy用法介绍-未完待续