避免重复下载

原文地址:http://docs.eoeandroid.com/training/efficient-downloads/redundant_redundant.html

重复下载是多余的

减少下载的最基本方法就是只下载你需要的。在数据方面,这意味着实现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();

当应用程序被卸载的时候,存储在本地缓存的文件会被删除。

使用HttpURLConnection Response Cache缓存

在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 。

你可能感兴趣的:(避免重复下载)