Android---冗余的下载是多余的

来源:互联网 发布:开票软件打不开没响应 编辑:程序博客网 时间:2024/05/18 01:01


本文译自:http://developer.android.com/training/efficient-downloads/redundant_redundant.html

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

还可以使用托管或安全的应用程序缓存。需要注意的是,这种内部缓存可能在系统运行时内存低于可用存储时被清空。

Context.getCache();

存储在缓存位置的文件会在应用程序卸载时被删除。

使用HttpURLConnection响应缓存

Android4.0把一个响应缓存添加到HttpURLConnection类中。你可以使用下列反射方法,在被支持的设备上启用HTTP响应缓存:

privatevoidenableHttpResponseCache(){
  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 responsecache is unavailable.");
  }
}

上述示例代码会在Android4.0以上的设备上打开响应缓存而不影响早期的版本。

使用被安装的缓存,HTTP请求可以直接从本地缓存中获取服务,而无需打开网络连接。有条件的缓存响应结果,可以有效的验证来自服务端的数据的新鲜度,从而消除相关下载的带宽成本。

从响应缓存中获取未被缓存的响应会引发新的请求。

1 0