You know what the fastest, most efficient piece of content for networking performance is? The one you never have to download.
Video Link



Reading data from local memory v.s. Reading data from network

访问本地数据的速度要远远快于访问网络数据(废话!)。接下来,文章中会介绍一些本地缓存的策略与实现。

Enable Http Caching

默认情况下,Http Cache在Android系统中是关闭的,需要使用HttpResponseCache手动开启,如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
protected void onCreate(Bundle savedInstanceState) {
try {
File httpCacheDir = new File(context.getCacheDir(), "http");
long httpCacheSize = 10 * 1024 * 1024; // 10 MB
HttpResponseCache.install(httpCacheDir, httpCacheSize);
} catch (Exception e) {
Lot.i(TAG, "Http response cache installation failed" + e);
}
}

protected void onStop() {
HttpResponseCache cache = HttpResponseCache.installed();
if (cache != null) {
cache.flush();
}
}

这样做会为所有的Http请求提供缓存,不仅是自己代码中发出的,也包括所依赖外部jar包发出的请求。


Invalidation

Cache有两种最基本的过期的策略:空间(Cache空间不足时触发)和时间(Cache超过过期时间后触发)。

在 Http 1.x 的header中,用Cache-Control来标示缓存策略。


HttpResponseCache的限制

HttpResponseCache通过Server来控制所有Cache策略,这在大部分场景是没有问题的,毕竟Server知道它返回给Client的具体内容是什么(文字、图片、文件等等),然而,移动应用的特殊性使得它还需要更精细的控制。

  • Server可能在Header中压根就没有为Cache-Control赋值
  • 移动设备的存储空间有限以至于无法保存Cache数据
  • 网络环境高延迟

因此,你需要自己定制一个Cache框架并引入Cache功能,这两件事不得不做:

  1. Write your own Disk Cache manager
  2. Use custom Caching Logic

可以参照已有的DiskLruCache

不同数据的各自属性通常要求各异的Cache策略,比如,文字提示语的过期时间与头像的过期时间是不同的。


Codes & Tools

一些优秀的网络请求框架

AndroidStudio提供了查看网络数据流量的Network Traffic Tool

更专业的工具是AT&T提供的ARO tool


===Ending===