数十亿用户的连接

全球有过半用户是通过 2G 网络连接使用您的应用。若要改善这些用户的体验,就需要针对低速连接和离线运行进行优化。为此,您可通过存储数据、建立请求队列和处理图像来实现最佳效果。

您可以在下文找到有关如何完成这些任务的一些提示。

优化图像

您可以通过多种方式来简化图像下载过程,其中包括提供 WebP 图像、动态调整图像尺寸和使用图像加载库。

提供 WebP 图像

  • 通过网络提供 WebP 文件,以缩短图像加载时间,并节省网络带宽。同样的图像文件,采用 WebP 格式时通常比采用 PNG 和 JPG 格式时体积更小,而图像质量却毫不逊色。即便是采用有损设置,WebP 也能生成与原始图像近乎完全相同的图像。Android 自 Android 4.0(API 级别 14:Ice Cream Sandwich)起提供对有损 WebP 的支持,自 Android 4.2(API 级别 17:Jelly Bean)起提供对无损、透明 WebP 的支持。

动态调整图像尺寸

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

使用图像加载库

  • 应用对任何图像的提取都不应超过一次。诸如 GlidePicasso 这类的图像加载库能够提取和缓存图像,并提供视图的钩子以显示占位符图像,直至实际图像准备就绪。由于图像已缓存,这些库会在下一次收到图像请求时返回本地副本。
  • 图像加载库会对其缓存进行管理,只保留最新的图像,这样应用占用的存储空间就不会无限增长下去。

优化网络连接

您可以通过提供最佳网络体验来提升用户体验。例如,让应用可离线使用、使用 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 来接收该广播。收到该广播后,您应该重新评估当前网络状态,并相应地调整界面和网络使用。您不应在清单中声明此接收器,因为此功能在 Android 7.0(API 级别 24)及更高版本系统中不可用。有关 Android 7.0 中此项变更及其他变更的详细信息,请参阅 Android 7.0 变更

其他资源

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

博文