应用的某些用户可能只能间歇性地访问互联网,或者可以下载到其设备上的信息量有限。您可以通过减少应用需要下载的数据量,鼓励用户更频繁地与您的应用互动。
减少下载量的最基本方法是仅下载所需内容。在数据方面,这意味着实现 REST API,以便您指定查询条件,从而使用上次更新时间等参数限制返回的数据。
同样,在下载图片时,最好在服务器端缩减图片大小,而不是下载完整尺寸的图片并在客户端缩减其大小。
缓存 HTTP 响应
另一种重要方法是避免下载重复数据。您可以使用缓存来降低重复下载同一数据的可能性。通过缓存应用的数据和资源,您可以创建应用需要引用的信息的本地副本。如果您的应用需要在短时间内多次访问同一条信息,您只需将其下载到缓存中一次。
请务必尽可能积极地进行缓存,以减少下载的数据总量。请始终尽可能长时间地缓存静态资源,包括按需下载的内容(例如完整尺寸的图片)。点播资源应单独存储,以便您定期刷新点播缓存来管理其大小。
为确保缓存不会导致应用显示过时数据,请使用适当的 HTTP 状态代码和标头,例如 ETag 和 Last-Modified 标头。这样,您就可以确定何时应刷新关联的内容。例如:
Kotlin
// url represents the website containing the content to place into the cache. val conn: HttpsURLConnection = url.openConnection() as HttpsURLConnection val currentTime: Long = System.currentTimeMillis() val lastModified: Long = conn.getHeaderFieldDate("Last-Modified", currentTime) // lastUpdateTime represents when the cache was last updated. if (lastModified < lastUpdateTime) { // Skip update } else { // Parse update lastUpdateTime = lastModified }
Java
// url represents the website containing the content to place into the cache. HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); long currentTime = System.currentTimeMillis(); 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; }
您可以将某些网络库配置为自动遵循这些状态代码和标头。例如,使用 OkHttp 时,为客户端配置缓存目录和缓存大小将使库能够使用 HTTP 缓存,如以下代码示例所示:
Kotlin
val cacheDir = Context.getCacheDir() val cacheSize = 10L * 1024L * 1024L // 10 MiB val client: OkHttpClient = OkHttpClient.Builder() .cache(Cache(cacheDir, cacheSize)) .build()
Java
File cacheDir = Context.getCacheDir(); long cacheSize = 10L * 1024L * 1024L; // 10 MiB OkHttpClient client = new OkHttpClient.Builder() .cache(new Cache(cacheDir, cacheSize)) .build();
配置缓存后,您可以直接从本地存储空间提供完全缓存的 HTTP 请求,而无需打开网络连接。 有条件缓存的响应可以从服务器验证其新鲜度,从而消除与下载相关的带宽费用。未缓存的响应会存储在响应缓存中,以供未来请求使用。
您可以使用 Context.getExternalCacheDir() 在非受管外部缓存目录中缓存非敏感数据。或者,您也可以使用 Context.getCacheDir() 将数据缓存在托管的安全应用缓存中。请注意,当系统可用存储空间不足时,此内部缓存可能会被清空。
使用代码库
如需采用更复杂的缓存方法,请考虑使用代码库设计模式。这涉及创建一个自定义类(称为“代码库”),该类通过一些特定数据或资源提供 API 抽象。代码库最初可能会从各种来源(例如远程 Web 服务)提取数据,但在后续调用中会向调用方提供数据的缓存版本。通过这一间接层,您可以提供特定于应用的强大缓存策略。如需详细了解如何在应用中使用仓库模式,请参阅应用架构指南。