您的一些应用用户网络连接不稳定,或者对其设备上可下载的信息量有限制。您可以通过减少应用需要下载的数据量来鼓励用户更频繁地与您的应用互动。
减少下载量的最基本方法是只下载您需要的内容。对于数据来说,这意味着实现 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()
将数据缓存到受管的安全应用缓存中。请注意,当系统可用存储空间不足时,可能会清除此内部缓存。
使用仓库
对于更复杂的缓存方法,可以考虑使用仓库设计模式(Repository design pattern)。这涉及创建一个名为 Repository 的自定义类,它为某些特定数据或资源提供 API 抽象。仓库最初可能会从各种来源(例如远程 Web 服务)获取其数据,但在后续调用中会向调用方提供数据的缓存版本。这一中间层可让您提供针对应用量身定制的强大缓存策略。如需详细了解如何在应用中使用 Repository 模式,请参阅应用架构指南。