网络请求优化的目的是尽可能的减少用户等待的时间、减少用户的流量使用、减少对手机电量的消耗,最终达到提升用户体验。
学习地址:Android开发性能优化解析
所谓流量优化,就是在保证数据正确的前提下,如何保证尽可能的少消耗用户流量。虽然现在的流量费用越来越便宜,但是减少流量本身并不是最重要的目的,而是提升用户体验带来的结果。
分为几种情况:
这种方案可以使得多次网络请求合并为一次,减少网络连接来回往返的等待时长。
比如有一种场景:App 本地数据库缓存有N个表,当老用户卸载重装时,首次检查需要把远端的数据一次性download到本地来,保证两端的一致性。
由于之前必然为每个表设计了一个api,但是在这种场景下,如果还是继续使用这些api的话,就需要N次网络请求,结果不仅会造成N次网络I/O和磁盘写入I/O,还会使得服务端查找性能降低,用户等待时间较长,本地磁盘写入性能降低。
针对这种场景,完全可以设计一个bulk sync api把这些api整合为一个,这样一来客户端只需一次网络I/O即可获取所有数据,服务端查找性能也提升了一个数量级,本地磁盘I/O也可以把此次返回的数据当成一次事务一次性插入数据库中,大大减少了用户等待时间,同时也提升了网络和本地磁盘写入性能。
当网络请求不可避免的情况下,此时就要考虑如何减少网络请求携带的数据量。
同样也分几种情况:
在进行网络流量优化的同时;由于网络请求次数;请求携带的数据量变少了;这其实也是在变相的提高网络速度。
另外,还有其他一些方式:
App与Server之间的API设计要考虑网络请求的频次, 资源的状态等. 以便App可以以较少的请求来完成业务需求和界面的展示。
2.Gzip压缩
使用Gzip来压缩request和response, 减少传输数据量, 从而减少流量消耗。
考虑使用Protocol Buffer代替JSON
从前我们传输数据使用XML, 后来使用JSON代替了XML, 很大程度上也是为了可读性和减少数据量(当然还有映射成POJO的方便程度)。
Protocol Buffer是Google推出的一种数据交换格式。
如果我们的接口每次传输的数据量很大的话, 可以考虑下protobuf, 会比JSON数据量小很多。当然相比来说, JSON也有其优势, 可读性更高。
3.图片的Size
上面Network Monitor中看到的22s到27s之间的有多次请求, 且数据量还很大. 就是在获取图片资源。图片相对于接口请求来说, 数据量要大得多. 故而也是我们需要优化的一个点。
我们可以在获取图片时告知服务器需要的图片的宽高, 以便服务器给出合适的图片, 避免浪费。现在很多公司的图片资源都是使用第三方的云存储服务的(七牛, 阿里云存储之类的)
以七牛为例, 可以在请求图片的url中添加诸如质量, 格式, width, height等path来获取合适的图片资源:
百度其中就有使用的是一个循序渐进的过程,通过三个阶段来建立一个弱网标准。
第一阶段,线下测试:
获取预期的阈值,在测试App网络切换、DNS故障时,抓取这些数据
第二阶段,线上进行验证:
通过线下获取到的阈值,在线上可以获取到弱网的比例,找到会出现弱网的场景,进行诊断优化。(比如网络体验最好的微信,也只是在信令的传输上优化到极致)
第三阶段,线上反复试验:
通过反复试验来调整阈值,使得优化更接近业务层。
腾讯的做法也大同小异,都是根据2.2的指标进行数据收集,整理一套达到弱网时的数据标准。但是我们该如何去探测这些数据呢?这需要我们实现一套完整的网络探测架构。
网络探测是弱网检测的基础,目标是能够即时、正确的检测出网络质量,我们把网络探测分成两个部分,主动网络探测和被动网络采集。
主动检测,就是在触发了某些特定条件后,主动的进行网络检测,并按照一定的条件检查出是否为弱网状态。架构图如下所示:
利用工具模拟弱网, 在弱网情况下体验我们的App. 一般来说, 网络延迟在60ms内, 是OK的, 超过200ms就比较糟糕了. 我们需要做的是在比较糟糕的网络环境下还能给用户较好的体验。
弱网优化, 本质上是在弱网的情况下能让用户流畅的使用我们的App. 我们要做的就是结合上述的优化项:
网络优化,是App优化中相当重要的一项优化. 除了客户端, 接口的优化外, 很多一部分优化还依赖于服务器端, 包括服务器端的代码开发, 部署方式等。看到这里想必大家心里应该都知道,应该学习哪块;哪里学习不够;和别人的区别在哪吧。
自己也是从事Android开发5年有余了;整理了一些Android开发技术核心笔记:
更多技术在免费Android技术丶面试题纲丶核心笔记资料