android 关于网络连接之传输数据节省电量1

来源:互联网 发布:打印机上数据没显示 编辑:程序博客网 时间:2024/06/14 10:16

声明:翻译自google官方SDK文档!适用于android2.0(API level 5)以及更高版本。


注意:下文所有诸如,无线电,无线电射频,等都是说的在非Wi-Fi环境下的网络。

在本课程中,将讲述如何最大限度的减少下载和网络连接对电池电量的消耗,尤其涉及到wireless radio(无线射频) 。

在本课程中还讲述了诸如缓存、轮询和预取技术、调度和执行下载的最佳做法。你将学习当无线射频的功率配置改变时,如何影响你的选择,以及应该怎么在无线射频功率配置改变时传输数据时最大限度的减少电量的消耗。


实现高效的网络访问来优化下载


本段课程主要讲述无线射频状态机( wireless radio state machine )和你的app连接状态如何与它进行交互。接着讲述怎样使用预取、捆绑转让(and bundle your transfers)来减少数据传输进而降低电池的消耗。

1.无线电状态机(The Radio State Machine)

一个完全活动的无线射频是非常耗电的,所以在不使用时为了节省电量,它会转换不同的状态,同时当射频需要“powering up”时,要努力减少延迟。


无线射频在典型的3G网络环境下包括三种状态:

  1. Full power (无线射频高功率)  :  当连接处于活动状态时无线射频处于此状态,允许设备进行高速传输数据。
  2. Low power (无线射频低功率) :相对于Full power状态,会消耗Full power状态电量的50%。
  3. Standby (无线射频待机):  最小电量消耗,网络是不活动的或者没有被唤醒。

当处于Low power和Standby状态下时对电量的消耗是非常少的,当同时也会带来显著的网络请求的延迟。从Low power状态跳转到Full power状态大概需要1.5秒,从Standby状态跳转到Full power需要超过2秒的时间。


为了尽量减少当网络请求时由于状态切换造成的延迟,采用从Full power状态切换到Standby状态时每一次切换都等待更长的时间,具体如下图所示(AT&T提出的对于一个3G无线的典型计时)


每一个设备上的无线电基本上都会采用图示的规则(2G、3G、LTE,等等),特别是相关的过渡延迟(“tail time”)和启动延迟。


本小节介绍如何在  采用具有代表性典型的3G无线射频的,并采用AT&T提出的延迟技术   的设备操作无线射频的最佳做法。


这种做法对于典型的网页浏览特别有效,当用户浏览网页时能够减少不必要的等待时间。同时较低的 "tail time"也保证了一旦浏览结束无线射频可以跳转到 较低的能量消耗状态。


不幸的是,这种做法在现在的智能OS上(例如android),会导致程序的效率低下,无论是在前台运行的(延迟-从低状态跳转到高状态的延迟时间造成体检不好)还是切换到后台的(耗电量优化-从高状态恢复到低状态有延迟造成不必要的电量浪费)。

2.应用程序怎样影响无线射频的状态(How Apps Impact the Radio State Machine)

每一创建一个新的网络连接时,无线射频都会过度到Full power状态。在上述典型的3G射频下,当你不需要网络时,它仍然会额外的保持在Full power状态5秒("tail time")。恢复到Low power状态会再额外保持12秒("tail time")之后才转入射频的待机状态Standby。所以在典型的3G设备上每一次的数据传输请求会导致无线射频持续消耗差不多20秒的电量。


在实践中,这意味着一个app每18秒就非捆绑式(就是分散请求网络传输数据)传输1次网络数据(在3G网络下),那么就将导致无线射频永远在活动。当无线射频将要变成待机状态(Stadby)时每一次数据传输又会将无线射频调整到高功率状态(Full power)下。最终结果就是,每1分钟都会使无线射频有18秒处于高功率(Full power)状态,42秒处于低功率状态(Low power)。

相比之下,同样的app,每分钟进行3秒捆绑式(几种请求网络数据,不是隔几秒就请求一次)数据传输将是无线射频只有8秒处于Full power状态,低功率Low power只有12秒。


第二个例子(捆绑式传输数据),能够是无线射频每分钟闲置(处于Standby状态)40秒,大幅度降低了电量的消耗。如下图:



3.预取数据。

预取数据能够有效的减少独立的网络会话(减少非捆绑式的网络数据请求)。预取能够一次性的在Full power状态下,下载你给定的一段时间内的所有数据在一个突发的当个网络连接上。这样就能够大大降低Full power和Low power的持续时间。


通过提前下载你需要的数据,可以减少下载数据所需的激活无线射频的次数。因此不仅可以延长电池使用时间,同时也降低了延迟,降低了所需要的带宽,并减少下载时间。


预取同时通过减少下载数据所需的时间来缩短用户看到数据并操作数据要等待的时间来提高用户体验。


然而,过于积极的使用预取技术会有降低电池使用时间、下载用户可用用不到的数据来所造成的数据带宽浪费的风险。同时确保当程序等待预取数据完成时,不要耽误程序的启动也很重要(就是一个页面需要的加载当前数据来显示,但是在加载当前数据时又预加载了下一页需要的数据,尽量不要因为预加载下一页数据造成当前页的延迟显示)。


应该如何积极的正确的采用预取技术取决于 数据的大小和它被使用的可能。基于上述的射频状态机制给出一个粗略的建议如下:对当前用户有 50%的可能会用到的数据,通常可以用6s时间来预取数据(大概1-2Mb)(在这里需要注意不要重复加载数据,比如:当前页加载当前页需要的数据时又开启了另一个任务来预加载下一页数据,当预加载没有完成时,用户跳转到了下一页,那么这里就要注意了不要重复加载,要先判断当前页的数据是否正在加载)。


通常来说,每隔2-5分钟就启动另一个任务来进行预下载(数据大小在1-5Mb)是很好的预取做法。


根据上述原则,进行大量下载时如视频文件,应定期(每2-5分钟)下载数据块,有效的预取接下来几分钟内要被观看的视频数据。


下面是一些实际例子:

①音乐播放器

你可以选择预取一整张专辑,但是如果用户停止​​听的第一首歌曲之后,你已经浪费了显著的带宽和电池寿命。


一个更好的方式是,除了正在播放的歌曲外可以预先读取下一首歌曲。对于流媒体音乐,不应该始终保持连续的流来让无线射频始终处于活动状态,而应该考虑使用HTTP的实时流传输来模拟上述的预取技术,就是在突发音频流上来使用HTTP的实时流传输。


②新闻阅读

许多新闻类app都视图通过 只预先下载用户选择过的新闻类别的头条新闻,以及只有当用户打开想要读取的新闻才下载整片新闻文章和用户滚动到有图片的地方时才加载图片 的方式来降低网络的使用。


使用这种方法将导致  当用户阅读新闻文章、滚动头条、改变类别时始终让无线射频保持活动状态。不仅如此,无线射频各个状态之间的转换需要的恒定时间会造成类别切换或新闻文章阅读时的显著延迟。


一个好的方法是,当程序启动时就预先下载一部分合理的数据,例如第一组新闻标题和缩略图来确保低延迟的启动(就是说不要在启动时预先下载大量数据,这样会造成很长时间的启动,因为只有当预先下载的数据完成时程序才会跳过启动页面进入主页面)。启动后继续加载剩余的标题和缩略图以及文章的文本 确保为剩余的文章至少提供主题列表。


另一种方法就是在预定的时间下预取所有的标题、缩略图、文章文本甚至是完整的文章图像。这种方法的风险是 流量的显著支出,以及可能造成预取出用户不会阅读的内容造成电量的不必要消耗,所以应谨慎实施。


还有一种方法是完全下载内容,只有当Wi-Fi连接时并且是正在充电。这中方法的更多细节描述见下面。


4.批量传输和连接

每次在3G环境下发起网络连接不论传输数据的大小,都会造成典型的无线射频状态的转换,无线射频会的功率将会消耗将近20秒的电量。


一个app每隔20秒就ping一次服务器,来验证app是否正在运行并且是否当前用户正在使用。会造成显著的电量消耗即使没有实际的数据传输。


考虑到上述问题,就会看到批量数据传输和挂起传输队列的重要性了。正确的做法是,尽可能的好好利用无线射频处于Full Power状态的时间,来预取合理的数据。


这种方法的基本理念就是要尽可能的降低请求次数,并且每次传输数据时要尽可能预先加载一些可能要被使用的数据。


That means you should batch your transfers by queuing delay tolerant transfers, and preempting scheduled updates and prefetches, so that they are all executed when time-sensitive transfers are required. Similarly, your scheduled updates and regular prefetching should initiate the execution of your pending transfer queue.


对于一个实际的例子,让我们回到上节中的例子(②新闻阅读)。

上面说的新闻阅读器的例子中,新闻阅读器会收集分析信息,来了解用户的阅读模式,以提供给用户喜欢的内容。为了保证新闻的更新,它会每小时进行检查更新。为了节省带宽它不会下载每个文章的所有图片,它只会取得文章图片的缩略图,只有当用户选中时(进入文章阅读)才会下载完整图片。

在这个例子中,所有的程序根据用户需求收集的文章信息都应该捆绑在一起排队下载,而不是只有当用户选择进入后才进行下载。当需要下载完整图片的时候预取操作(每小时的更新)应该让步。


任何一个敏感传输,例如下载一个完整图片时,应该抢占定期更新。当图片下载完成后按照计划在设定的时间再进行定期更新。这个方法能够减轻敏感即时数据加载的负担。


5.减少连接数

重用现有的网络连接比启动新的连接通常来说是更有效的做法。重用连接还可以使网络更加智能的应对拥堵和相关的网络数据问题。而不是创建多个连接同时下载数据或者一个连续的GET请求在一个连接上,在允许的情况下应该捆绑这些请求到一个单一的GET请求上。


例如,为所有新闻文章的  request/response  创建一个请求比创建多个请求更为有效。无线射频需要转变成活动状态来操作服务器和客户端之间的超时相关联的  终止/终止确认数据包,所以当不需要网络连接时应该关闭连接而不是等待它们超时。


过早的关闭网络连接会导致连接不能被再次使用,那么就需要额外的开销来建立新的连接。一个有效的妥协是,不要马上关闭连接,但是仍然好要确保在它真正超时前关闭它(就是说在关闭网络连接时看需求可以延迟几秒关闭)。


6.使用DDMS网络流量工具,找出关注的领域

以后再写。。。


1 0
原创粉丝点击