Android优化篇——网络连接

来源:互联网 发布:淘宝充值中心 编辑:程序博客网 时间:2024/06/05 05:31

苟利国家生死以,岂因祸福避趋之。——林则徐

全球范围内超过一半的用户依然使用2G网络,所以你的APP依然需要服务大多数的2G网络用户,这个有点夸张,毕竟在天朝,大概现在还在用2G的用户也不多了,即使像我这样怕麻烦的人,体验过4G以后就再也不愿用回2G了。但是指导方针不会变,今天来学习一下Google开发关于网络连接的优化。为了提高产品的体验,通过缓存本地数据,使用队列来管理请求,处理图片来获得最佳的性能,实现低速网络连接和离线操作。

优化图片

有许多方式来使得图片更加容易下载,比如使用* WebP*图片,动态地调整大小的图片,以及使用图片加载框架。

使用WebP图片
通过网络提供WebP文件来减少图片加载的时间和节省网络带宽,WebP文件通常会比它的PNG或者JPG文件小,但会拥有同样的图片质量。甚至是使用有损的设置,WebP也可以输出一个和原图几乎完全一样的图片。安卓系统从Android4.0(API 14)添加了有损耗的WebP support并且在Android4.2(API 17)对无损的,清晰的WebP提供了支持。

动态修改图片
应用要求按指定的渲染大小来从网络上请求图片,这个渲染大小和设备规格有关,并且服务器提供的是合适大小的图片。这样能够最小化网络上的数据传输,减少持有图片对内存的大量损耗,直接影响到性能的提高和用户满意度。

当用户不得不等待图片下载的时候用户体验就会有所下降,使用合适的图片尺寸有助于解决这些问题,可以考虑让图片的请求都基于网络的类型或者网络连接的质量,这个尺寸可能会比目标值小。

使用预计算调色板值pre-computed palette values或者低分辨率的缩略图作为动态占位符可以在获取图片的时候提高用户体验。

使用图片加载框架
你的APP不应该重复获取图片,图片加载框架比如Glide或者Picasso获取图片,然后缓存,然后hook到你的View来显示占位符图片,直到真正的图片准备好了显示真正的图片。因为图片被缓存下来了,当图片下次被请求的时候,这些图片加载框架会直接从本地缓存中获取。

图片加载框架会管理他们的缓存大小,保留最近使用过的图片,这样你的APP的大小不会无限制地增长。

优化网络

可以通过提供一个最佳的网络体验来增强用户体验,比如,你可以让你的APP在离线状态下依然可以使用,使用GcmNetworkManager和ContentProvider,删除重复的网络请求。

让你的APP在离线状态下依然可用
在一些比较偏僻的地方,通常网络信号都不会很好,APP失去网络连接是很常见的事情。创建一个能够在离线状态依然正常使用的APP意味着用户可以在任何时候和你的APP进行互动。可以通过把网络数据保存在本地来实现这个需求,缓存数据,并且把发出的请求添加到队列中,当网络恢复的时候再及时发出。
在可能的情况下,app不应该通知用户网络已经失去连接了,只有当用户进行操作,并且这个操作一定需要网络连接的支持,才通知用户当前处于没有网络的状态。

当一个设备处于没有网络连接状态时,应用应该允许用户发出的网络请求,在网络连接恢复以后再执行这些网络请求。一个例子就是一个邮件客户端允许用户在设备处于离线的状态下依然能够创建,发送,查看,移动和删除已经存在的邮件,就是因为这些操作被保存下来并且在网络恢复以后再执行。这样的话,APP就能够在设备有网络和没有网络的时候都提供一个相似的用户体验。

使用GcmNetworkManager和contentProvider
确保你的APP使用数据库或者相似的结构来保存所有的数据到磁盘上,这样它就能够在不管网络条件如何的情况下表现出极佳的体验,比如使用(SQLite和ContentProvider)缓存数据, GCM Network Manager ( GcmNetworkManager)提供一个健全的机制和服务器同步数据当 content providers (ContentProvider)缓存这些数据,结合来提供一个允许在离线状态继续使用的结构。

App应该缓存从网络上获取的内容,在发起持续的请求之前,app应该先显示本地的缓存数据。这确保了app不管设备有没有网络连接或者是很慢或者是不可靠的网络,都能够为用户提供服务。

除去网络请求
一个离线优先的结构初始化时会尝试从本地获取数据,失败以后,从网络请求数据。从网络检索以后,数据会缓存到本地。这就确保对于同一块数据发起网络请求只会发生一次,对随后的请求都会使用本地数据来完成请求。为了达到这个,使用本地数据库来对数据持久化(通常使用android.database.sqlite 或者 SharedPreferences

这个结构同样简化一个APP的流畅性,在离线和在线状态之间一方从网络获取数据保存到本地,另一方从缓存获取数据展示给用户。

对于短暂不持续的数据,也就是内容更新快的数据,使用一个有大小,或者时间限制的磁盘缓存,比如DiskLruCache,数据通常不会发生改变的就只从网络请求一次然后缓存下来以后使用,这样的数据一般是图片或者非临时的文档比如新闻文章或者推送消息。

调整数据传输

有几种方式让你的APP适应网络条件,提供一个较好的用户体验的,比如,对请求划分优先等级来最小化用户等待信息的时间。也可以检测并适应较慢网络速度和发生网络连接的时候的发生的改变。

优先考虑带宽
不应该假设设备连接的网络是一个长时间持续并且稳定可靠的网络,app应该对网络请求划分优先级尽可能快地展示最有用的信息给用户。

立刻呈现给用户一些实质的信息是一个比较好的用户体验,相对于让用户等待那些不那么必要的信息来说。这可以减少用户不得不等待的时间,增加APP在慢速网络时的实用性。

为了达到这个目的,对网络请求进行排序比如文本的获取应该在富媒体之前,文本请求一般都比较小,压缩更好,并且传输速度快,这意味着你的APP可以快速地先显示内容。

在慢速网络的时候使用更少的带宽
APP传输数据的能力是否及时取决于网络连接,检测这些网络的质量并且调整你的APP使用网络的行为可以提供一个更好的用户体验。

使用下列的方法来检测外部不容易观察的网络质量,使用从这些方法返回的数据,你的APP应该调整对网络的使用来为用户的操作提供一个及时的响应

ConnectivityManager> isActiveNetworkMetered()ConnectivityManager> getActiveNetworkInfo()ConnectivityManager> getNetworkCapabilities(Network)TelephonyManager> getNetworkType()

在一个慢速的网络连接中,考虑只下载低分辨率的媒体或者直接不下载。确保你的用户可以在慢速网络中继续使用你的APP,对于没有图片或者图片仍然在加载的情况,应该先显示一个占位符,使用 Palette library创建一个动态的占位符,生成一个符合目标图片颜色的占位符

在Android 7.0或更高版本的设备上,用户可以打开Data Saver设置,可以帮助最小化数据的使用,Android 7.0扩展ConnectivityManager来检测Data Saver设置。

检测网络改变,然后修改APP的行为
网络质量不是固定不变的,它会随着地理位置,网络流量和当地人口密度发生改变。APP 应该检测网络中的改变并且相应地调整带宽,让APP可以更好地适应网络质量,可以实现下面的这些方法检测网络状态:

ConnectivityManager> getActiveNetworkInfo()ConnectivityManager> getNetworkCapabilities(Network)TelephonyManager> getDataState()

随着网络质量的下降,减少请求的数量,随着网络质量的提升,你可以提高你的请求量到最优级别。
在更高的网络质量下,不计费使用流量的网络,可以考虑预取数据让数据提前可用。从用户体验的立场,这可能意味着一个新闻阅读应用在2G网络下一次只能获取3篇文章,而在WIFI状态下一次可以获取20篇文章。

当网络连接状态发生改变时会发出CONNECTIVITY_CHANGE广播,APP在前台运行的情况下,可以通过注册广播接收器来接受这个广播,在接收广播以后,你应该再评估当前的网络状态并且调整你的UI,处理网络请求,不能够在manifest文件中声明这个广播Action,因为在Android7.0版本之后这个Action就被删除了。

最后总结一下:
首先关于网络连接(指的是不同网络状态),这些优化从根本上都是为了获得更好的用户体验,从三个方面来解决:
1、基于图片加载的优化

  • 使用本地缓存来缓存图片
  • 减少图片的数据传输量,具体来说就是需要多大的图片就获取多大的图片
  • 使用WebP文件,这是一种新的图片格式,体积更小
  • 使用占位符来提高用户体验

2、基于网络质量的优化

  • 离线模式下,用户依然可进行操作,把请求保存下来,等到网络恢复后执行
  • 对于统一数据块缓存网络数据,这样每次请求这一块的数据,只从缓存中读取
  • 减少不必要的请求量

3、基于网络状态的优化

  • 根据网络状态对请求设置优先级,不同的网络状态实现不同的网络请求方案
  • 在网络极好的情况下,预取数据,一方面也可以减轻网络不好时的影响
  • Data Saver减少带宽的使用

学习自:对网络连接的优化

0 0