避免未经优化的下载

您的应用的部分用户在访问互联网时遇到时断时续或受到限制 可以下载到设备上的信息量您可以 通过减少 您的应用需要下载的数据

要减少下载内容,最基本的方法是只下载你 。就数据而言,这意味着实现 REST API,让您可以 使用如下参数指定用于限制返回数据的查询条件: 上次更新的时间

同样,在下载图片时 而不用下载完整尺寸的图片 在客户端上运行

缓存 HTTP 响应

另一种重要方法是避免下载重复数据。您可以 降低重复下载同一段数据的可能性, 缓存。通过缓存应用的数据和资源,您可以创建 您的应用需要引用的信息。如果您的应用需要 您就需要在短时间内多次分析同一条信息, 只将其下载到缓存一次。

因此,请务必尽量积极地进行缓存 下载的数据量。始终缓存静态资源,包括 按需下载,例如完整尺寸的图片, 按需资源应单独存储,以便您可以 定期刷新您的按需缓存以管理其大小。

为确保缓存不会导致应用显示过时数据, 使用适当的 HTTP 状态代码和 标头, 例如 ETagLast-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 抽象。仓库 最初可能从各种来源(例如远程网络服务、 但在后续调用中为调用方提供数据的缓存版本。这个 让您能够提供稳健的缓存策略, 您的应用详细了解如何使用仓库模式 请参阅应用指南 架构