数十亿用户的连接

全球超过一半的用户将通过 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 更改

其他资源

要详细了解如何支持各种连接速度,请查看以下资源。

博文