避免多余的下载
很多用户间歇性的联网并且有下载量的限制。你可以鼓励用户与应用交互的时候尽量降低下载量。
降低下载量最根本的方式就是只下载有用的数据。这里的数据指的是实现了REST API,允许你指定查询标准,用参数比如上次下载时间来限制返回的数据。
相似的,当下载图片时,最好在服务器端压缩一下,而不是下载大图片,再在本地压缩显示。
本地文件缓冲
另一个重要的技术就是避免重复下载。你可以用缓冲来降低重复下载相同数据的可能性。通过缓冲应用数据和资源,你可以创建一个应用需要的信息的本地副本。如果应用短期内需要多次访问同一个信息,那么只需要下载一次到缓冲区就可以了。
为了降低总下载量,缓冲越多越好。只要合理,总是缓冲静态资源,包括用户请求的图片的全文下载。用户请求的资源应单独存储,以便定期刷新缓冲区来管理他的大小。
为了确保你的应用显示的不是过期的信息,要从HTTP返回的头信息中解析出所请求的内容的上次更新时间和过期时间。这样你就知道什么时候该刷新相关内容了。
// url represents the website containing the content to place into the cache.
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
long currentTime = System.currentTimeMillis();
long expires = conn.getHeaderFieldDate("Expires", currentTime);
long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime);
// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
// Skip update
} else {
// Parse update
lastUpdateTime = lastModified;
}
用这个策略,你可以高效的动态缓冲数据并保证应用不显示过期信息。
你可以在非托管的外部缓冲路径缓冲不是那么敏感的信息。
Context.getExternalCacheDir();
你也可以选择用托管的安全的应用缓冲。注意内部缓冲可能会在系统内存地的时候被清掉。
Context.getCacheDir();
注意:不管存在哪个路径下,当应用卸载的时候,数据都会被清掉。
用HttpsURLConnection 返回缓冲
Android4.0给HttpURLConnection添加了一个返回缓冲。你可以通过反射打开这个返回缓冲。
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+设备上的返回缓冲,并且兼容了之前的版本。
缓冲安装后,完全缓冲的HTTP请求可以直接从本地下载,避免了打开网络连接。缓冲的数据有条件的情况下可以与服务器同步,降低了下载所需带宽。