数十亿用户的连接

全球过半的用户将通过 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 等图像加载库能够提取图像,缓存图像,并提供与您视图的连接以显示占位符图像,直至实际图像准备就绪。由于图像已缓存,这些库会在下一次收到图像请求时返回本地副本。
  • 图像加载库会对其缓存进行管理,只保留最新的图像,让您的应用存储不致无限度增长。

优化网络连接

您可以通过提供最佳网络体验来提升用户体验。例如,让您的应用可离线使用,使用 GcmNetworkManager 和内容提供程序,以及执行网络请求去重。

让您的应用可离线使用

  • 在偏远地区和不太富有的区域,设备常常会失去网络连接。创建实用的离线状态,意味着用户始终可以与您的应用进行交互。为此,您可以将数据存储在本地、缓存数据,以及建立出站请求队列以待连接恢复时完成相关操作。
  • 在可能的情况下,应用不应通知用户已失去网络连接。只有在用户执行的操作必须连接网络时才需要通知用户。
  • 当设备没有网络连接时,您的应用应代表用户将可在连接恢复时执行的网络请求加入队列。例如,即便在设备处于离线状态时,用户也可以通过电子邮件客户端撰写、发送、阅读、移动和删除现有邮件。这些操作可缓存起来,在连接恢复时执行。这样一来,无论设备在线还是离线,应用均可提供相似的用户体验。

使用 GcmNetworkManager 和内容提供程序

  • 确保您的应用使用数据库或类似结构将所有数据存储在磁盘上,使其在任何网络条件下都能发挥最佳性能(例如,使用 SQLite 和 ContentProvider)。GCM 网络管理器 (GcmNetworkManager) 可提供稳健的机制与服务器同步数据,而内容提供程序 (ContentProvider) 可缓存这些数据,两者结合使用所形成的架构可实现实用的离线状态。
  • 应用应缓存从网络获取的内容。在发出后续请求之前,应用应显示本地缓存的数据。这可以确保应用在设备离线或网络连接速度缓慢、不可靠的情况下正常工作。

网络请求去重

  • 离线优先架构最初会尝试从本地存储获取数据,失败时才会从网络请求数据。从网络检索数据后,数据将缓存在本地以供日后检索。这有助于确保同一组数据只通过网络请求一次,后续请求可通过本地数据得到满足。为此,请使用本地数据库来存储长期存在的数据(通常是 android.database.sqliteSharedPreferences)。
  • 这种架构还可简化应用在离线与在线状态之间的转变,因为一方面,它会将从网络提取的数据存入缓存;另一方面,又会检索缓存中的数据,将其提供给用户。
  • 对于暂时数据,请使用 DiskLruCache 等有界磁盘缓存。通常不会发生变化的数据只应通过网络请求一次,然后缓存起来以供日后使用。举例来说,图像以及新闻文章或社交帖子之类的非时间性文档便属于此类数据。

微调数据传送

您可以通过多种方式进行调整,让您的应用适应网络条件以提供更出色的用户体验。例如,应用可以划分网络请求的优先级,以最大限度地减少用户等待信息的时间。应用也可以检测并适应较慢的网络速度以及在此网络连接条件下可能发生的变化。

划分带宽优先级

  • 您不应假定设备连接的任何网络均能保持持久或可靠的连接。因此,应用应划分网络请求的优先级,将最有用的信息尽快显示给用户。
  • 与让用户等待其可能并不需要的信息相比,立即为用户提供可见的相关信息可带来更好的用户体验。这可以缩短用户的等待时间,并提高应用在连接慢速网络条件下的实用性。
  • 为实现此目的,为网络请求划分优先顺序时,请让文本获得高于富媒体的获取优先级。文本请求往往体积更小、压缩率更高,因此传送速度更快,这意味着您的应用可快速显示有用的内容。如需了解有关管理网络请求的详细信息,请访问有关管理网络使用的 Android 培训。

在低速连接条件下减少带宽使用

  • 您的应用及时传送数据的能力取决于网络连接。检测网络质量并调整您的应用的网络使用方式有助于带来出色的用户体验。
  • 您可以利用下列方法来检测底层网络质量。您的应用应利用从这些方法获得的数据来定制其对网络的使用策略,以便继续对用户操作做出及时响应:
  • 在网速较慢时,请考虑只下载低分辨率媒体,或不下载任何媒体。这可以确保您的用户在网速较慢时仍可使用应用。未获得图像或图像仍在加载时,应始终为其显示占位符。您可以通过使用调色板库生成与目标图像相符的占位符颜色,创建动态占位符。
  • 在采用 Android 7.0(API 级别 24)及更高版本系统的设备中,用户可以打开流量节省程序设置,帮助最大限度地减少数据流量的使用。Android 7.0 扩展 ConnectivityManager 的功能,使之能够检测流量节省程序设置。有关此功能的详细信息,请参阅流量节省程序

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

  • 网络质量不是静态的;它会随着位置、网络流量和本地人口密度而变化。应用应检测网络变化并相应调整带宽。通过这种方式,您的应用可以根据网络质量定制用户体验。利用以下方法来检测网络状态:
  • 在网络质量下降时,按比例减少请求的数量和大小。在连接质量改善时,可以按比例增加请求至最佳水平。
  • 使用质量较高的无限流量网络时,请考虑提前预取数据,以供日后使用。从用户体验的角度来看,这可能意味着新闻阅读器应用在使用 2G 网络时一次提取三篇文章,但在使用 WLAN 时则会一次提取二十篇文章。如需了解有关根据网络变化调整应用行为的详细信息,请参阅有关监控连接状态的 Android 培训。
  • 当网络连接发生变化时,会发送广播 CONNECTIVITY_CHANGE。当您的应用在前台运行时,您可以调用 registerReceiver 来接收该广播。收到该广播后,您应该重新评估当前网络状态,并相应调整您的界面和网络使用。您不应在清单中声明此接收器,因为此功能在 Android 7.0(API 级别 24)及更高版本系统中不可用。有关 Android 7.0 中此项变更及其他变更的详细信息,请参阅 Android 7.0 变更