【Android Training - Connectivity】优化下载的效率[Lesson 3 - 使用缓存来避免重复的下载]

来源:互联网 发布:丹尼斯c语言 编辑:程序博客网 时间:2024/05/16 11:57

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,谢谢!

原创粉丝点击