减少下载的最基本方法就是只下载你需要的。在数据方面,这意味着实现REST APIs,通过API你可以指定查询条件(使用参数,比如最近更新的时间)来来限制返回的数据。
同样,当我们下载图片的时候,好的做法是在服务器端减少图片的尺寸,而不是下载完整尺寸的图片,然后再在客户端裁剪图片的尺寸。
另一个重要的技巧是避免下载重复数据,你可以使用缓存来实现。通常缓存静态资源,包括按需下载的合理的资源(比如全尺寸的图片)。这些按需下载的资源应该单独存储,这样一来你就可以定期清理缓存以保证缓存的大小。
确保您的缓存不会导致应用程序显示旧的数据,一定要使用最近更新的请求内容,而且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();
另外,你可以使用这些托管的/安全的(managed / secure )应用程序缓存。但是需要注意的是:当系统存储比较低的时候内部缓存可能被清除。
Context.getCache();
当应用程序被卸载的时候,存储在本地缓存的文件会被删除。
在Android 4.0里面为HttpURLConnection添加了一个响应缓存(response cache ),你可以通过反射机制使用HTTP response caching ,当然前提是你的设备支持android4.0,请看下面的例子:
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."); } }
上面的示例代码将在android4.0+的设备上打开响应缓存,同时不影响较早的版本(这段代码对android4.0以前的版本没有影响)。
当缓存开启,所有缓存的HTTP请求都可以直接从本地存储中响应,而无需打开一个网络连接。在下载的时候,Conditionally cached responses 会从服务器端验证其是否有效,从而减少带宽消耗。
Uncached responses会在下次请求的时候存储在响应缓存中(the response cache )从而变为Conditionally cached responses 。