【Android Developers Training】 85. 不要有冗余的下载
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。
原文链接:http://developer.android.com/training/efficient-downloads/redundant_redundant.html
最基本的减少你的下载数量的方法就是只下载你需要的数据。就数据而言,这就意味着实现REST APIs(译者注:REST即Representational State Transfer,意为表述性转移状态,在Web服务中,经常能看到基于RESTful的设计风格),它可以允许你使用一些参数如:上一次更新的时间,来指定限制返回数据的查询条件。
类似的,当下载图片时,减少服务端的图片尺寸,而不是在客户端把完整图片全下载下来再调整尺寸,也是一个好的习惯。
一). 在本地缓存文件
另一个重要的技术是避免下载重复数据。你可以使用缓存来实现。总是缓存静态资源,如包括一些点播类的下载如完整尺寸的图片(如果条件允许的话)。这类资源应该独立地存储起来,来保证你能定期的清空你的资源缓存从而能够控制它的大小。
要保证你的缓存不会导致你的应用显示的是陈旧的无用信息,应该从HTTP响应头中,提取出这个请求内容上一次更新的时间,以及它什么时候会过期。这可以让你确定什么时候相关的内容要被刷新。
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();
当应用被卸载时,不管文件存储于哪一种类型的缓存,都会被清除。
二). 使用HttpURLConnection响应缓存
Android 4.0在“HttpURLConnection”中添加了一个响应缓存。你可以在支持的设备上使用JAVA反射(如下所示)来启用HTTP响应缓存:
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."); } }
这一样例代码会在Android 4.0+的设备上启用响应缓存,而不会影响到早期版本的系统。
在使用了该缓存后,被完整缓存的的HTTP请求可以直接被本地存储所响应,从而不需要再打开一个新的网络连接。另外缓存可以定期通过向服务器询问自己的实时性,这样就可以避免了一部分由于下载数据导致的带宽损耗。
没有被缓存的响应会被存储于响应缓存中以备将来可以用来响应相关的请求。