数十亿用户的连接

全球超过一半的用户将通过 2G 连接体验您的应用。为了改善他们的体验,请针对低速连接和离线工作进行优化,方法是存储数据、排队请求以及处理图像以获得最佳性能。

您可以在此处找到一些有关如何完成这些操作的提示。

优化图像

有多种方法可以使图像更易于下载。这些方法包括提供 WebP 图像、动态调整图像大小以及使用图像加载库。

提供 WebP 图像

  • 通过网络提供 WebP 文件,以减少图像加载时间并节省网络带宽。WebP 文件的大小通常小于其 PNG 和 JPG 对应文件,并且具有至少相同的图像质量。即使使用有损设置,WebP 也可以生成与原始图像几乎相同的图像。Android 自 Android 4.0(API 级别 14:冰淇淋三明治)起便包含了对有损 WebP 支持,并且自 Android 4.2(API 级别 17:果冻豆)起便支持对无损透明 WebP 的支持。

动态调整图像大小

  • 根据设备规格和服务器提供的适当大小的图像,让您的应用以目标渲染大小请求图像。这样做可以最大程度地减少通过网络发送的数据量,并减少保存每个图像所需的内存量,从而提高性能并提升用户满意度。
  • 当用户必须等待图像下载时,用户体验会下降。使用适当的图像大小有助于解决这些问题。考虑根据网络类型或网络质量发出图像大小请求;此大小可能小于目标渲染大小。
  • 诸如 预计算调色板值 或低分辨率缩略图之类的动态占位符可以在获取图像时改善用户体验。

使用图像加载库

  • 您的应用不应多次获取任何图像。诸如 GlidePicasso 之类的图像加载库会获取图像、将其缓存并提供挂钩到您的 View 中,以便在实际图像准备好之前显示占位符图像。由于图像已缓存,因此这些库在下次请求图像时会返回本地副本。
  • 图像加载库管理其缓存,保留最新的图像,以使您的应用存储不会无限增长。

优化网络

您可以通过提供最佳的网络体验来增强用户体验。例如,您可以使您的应用能够离线使用,使用 WorkManagerRoom,以及对网络请求进行重复数据删除。

使您的应用能够离线使用

  • 在农村地区和较贫困地区,设备失去网络连接的情况很常见。创建有用的离线状态意味着用户可以随时与您的应用互动。为此,请在本地存储数据、缓存数据并将出站请求排队,以便在连接恢复时执行。
  • 如果可能,应用不应通知用户连接已断开。只有当用户执行需要连接的操作时,才需要通知用户。
  • 当设备缺少连接时,您的应用应代表用户批量处理可以恢复连接后执行的网络请求。例如,电子邮件客户端允许用户即使在设备离线时也能撰写、发送、阅读、移动和删除现有邮件。这些操作可以缓存并在连接恢复时执行。这样做,无论设备是联机还是离线,应用都能够提供类似的用户体验。

使用 Room 获取和缓存数据

  • 确保您的应用使用数据库或类似结构将所有数据存储在磁盘上,以便无论网络状况如何都能获得最佳性能。使用 Room 持久性库 将数据缓存在本地数据库中,并使用 WorkManager 在设备具有网络连接时更新该缓存。
  • 应用应缓存从网络获取的内容。在发出后续请求之前,应用应显示本地缓存的数据。这确保了应用无论设备是离线还是在速度缓慢或不可靠的网络上都能正常工作。

对网络请求进行重复数据删除

  • 离线优先架构最初尝试从本地存储获取数据,如果失败,则从网络请求数据。从网络检索后,数据将缓存在本地以供将来检索。这有助于确保对同一数据段的网络请求仅发生一次——后续请求在本地得到满足。为此,请对长期数据使用本地数据库(通常为 android.database.sqliteSharedPreferences)。
  • 此架构还简化了应用在离线和联机状态之间的流程,因为一侧从网络获取到缓存,而另一侧则从缓存检索数据以呈现给用户。
  • 对于瞬态数据,请使用有界磁盘缓存,例如 DiskLruCache。通常不会更改的数据应仅通过网络请求一次并缓存以供将来使用。此类数据的示例包括图像和非时间性文档,如新闻文章或社交帖子。

微调数据传输

您的应用可以通过多种方式适应网络状况以提供更好的用户体验。例如,它可以优先处理网络请求以最大程度地减少用户等待信息的时间。它还可以检测并适应网络连接中可能发生的较慢的网络速度和变化。

优先考虑带宽

  • 您不应该假设设备连接的任何网络都是持久或可靠的。因此,应用应优先处理网络请求,以便尽快向用户显示最有用的信息。
  • 立即向用户呈现可见且相关的信息,比让他们等待可能不需要的信息提供更好的用户体验。这减少了用户等待的时间,并提高了应用在缓慢网络上的实用性。
  • 为了实现这一点,请按顺序排列您的网络请求,以便在丰富媒体之前获取文本。文本请求往往较小,压缩效果更好,因此传输速度更快,这意味着您的应用可以快速显示有用的内容。有关管理网络请求的更多信息,请访问 Android 培训中的 管理网络使用

在较慢的连接上使用较少的带宽

  • 您的应用及时传输数据的能力取决于网络连接。检测网络质量并调整应用使用网络的方式,可以帮助提供出色的用户体验。
  • 您可以使用以下方法检测底层网络质量。利用这些方法提供的数据,您的应用应调整其网络使用方式,以继续对用户操作做出及时响应。
  • 在较慢的连接上,请考虑仅下载较低分辨率的媒体,或者根本不下载。这确保了用户可以在缓慢的连接上使用应用。在没有图像或图像仍在加载的情况下,您应该始终显示占位符。您可以使用 调色板库 生成与目标图像匹配的占位符颜色,从而创建动态占位符。
  • 在 Android 7.0(API 级别 24)及更高版本的设备上,用户可以开启 **数据节省** 设置,这有助于最大程度地减少数据使用量。Android 7.0 扩展了 ConnectivityManager 以检测 **数据节省** 设置。有关此功能的更多信息,请参阅 数据节省

检测网络变化,然后更改应用行为

  • 网络质量不是静态的;它会根据位置、网络流量和当地人口密度而变化。应用应检测网络变化并相应地调整带宽。通过这样做,您的应用可以根据网络质量定制用户体验。使用以下方法检测网络状态
  • 随着网络质量下降,请缩减请求的数量和大小。随着连接质量的提高,您可以将请求扩展到最佳级别。
  • 在更高质量的非计费网络上,请考虑 预取数据 以提前提供数据。从用户体验的角度来看,这可能意味着新闻阅读器应用在 2G 网络上一次获取三篇文章,但在 Wi-Fi 网络上一次获取二十篇文章。有关根据网络变化调整应用行为的更多信息,请访问 Android 培训中的 监控连接状态
  • 当网络连接发生变化时,会发送广播 CONNECTIVITY_CHANGE。当您的应用处于前台时,您可以调用 registerReceiver 来接收此广播。收到广播后,您应重新评估当前网络状态并适当地调整您的 UI 和网络使用情况。您不应该在清单中声明此接收器,因为它在 Android 7.0(API 级别 24)及更高版本中不可用。有关此信息以及 Android 7.0 中其他更改的更多信息,请参阅 Android 7.0 更改

其他资源

要了解有关支持各种连接速度的更多信息,请查看以下资源

博客文章