《Android高性能编程》-网络

《Android高性能编程》-网络

2018, Apr 27    

预览

HttpClient, URLConnection 协议:Http,https, ftp, File, Jar
方法:GET, POST(connection.setDoOutput),其余通过 HttpURLConnection.setRequestMethod()
头部: URLConnection.setRequestProperty/ getHeaderFields
超时: 链接超时;读取超时
内容:使用URLConnection.getContent()方法,以InputStream形式得到内容。内容长度,MIME类型,编码类型
压缩:content-encoding指定压缩类型(gzip),需要通过特定InputStream读取
响应码
2xx: 已收到请求,并将响应发出去
3xx: 重定向
4xx: 请求存在一些错误
5xx:服务端存在在一个内部错误,或某些地方过载
连接类型: MOBILE, WIFI, WIMAX, ETHERNET, BLUETOOTH

最佳实践

  1. 根据连接速度动态改变要传输的内容
  2. 预获取数据
  3. 响应缓存,确认再服务端有没有被修改
  4. 推送和轮训
  5. 当后端出现临时错误时,可以对请求进行显示,采用退避指数算法。

延迟测定

无法对请求时间金预测,但是可以对请求时间做追踪并计算出平均值,从而根据延迟情况制定和采用不同策略。还可以根据延迟动态改变请求,以适应网络较慢情况。
比WIFI更高的LTE

批量连接

每次为了连接网络而开启无线电,大约会消耗20s的电量,尽可能减少网络连接的次数非常重要。可以参考一个策略:将客户端和服务端之间要进行交换的数据,收集起来,当数量足够多时,才进行连接。
两种:1. 为大量数据执行一个单独请求;2. 批量执行多个请求,以避免非必要的无线电操作所带来的电量消耗
####预获取 在连接可用时,尽可能发起各个请求,预先载入好,最好结合延迟测定技术一起使用,采用不同的预获取策略

队列连接

请求不会被立即执行,会组织成一个队列,批量连接。

对响应进行缓存

####缓存控制 HttpResponseCache:将响应以缓存的形式保存到文件系统中。它需要设定一个上线,当达到该上限时,便删除不必要的项目,释放磁盘空间。
此外,可以将该请求持久化到文件系统中,这样,在应用程序下次启动时,仍然可用。
决定每个请求是否需要被缓存:addRequestProperty(“Cache-Control”, POLICY)。策略有在指定时间内再次访问,不会从服务端请求,而是取之前的缓存;能接受过期对象,但时间不应超过指定值等。
一旦开启会应用于每个请求,最好的方式是让服务端返回cache-control Header,能够控制请求的过期时间,如果不能访问服务端代码,则需根据服务端实际返回响应中的Header,指定一个处理缓存响应过L期时间的策略。

LastModified(返回数据、修改时间自己对比)

可以通过读取响应的Last-ModifiedHeader,得到该资源上次被修改的日期。通过ExpireHeader来获知上一次请求所返回的内容是否有效。可以将资源以及上次修改时间一次缓存,然后将该日期与服务端返回的日期作对比,从而运用缓存策略对缓存资源以及图形界面布局进行更新。

If-Modified-Since(请求中加时间,服务端确认有无更新)

请求中加入上次请求时间,服务端返回1. 有修改(200)+资源,2. 无修改(304)
这样如果无更新则不加内容,减少了负载。

指数退避算法

当服务端出现错误时,该模式以递增的时间间隔,对后续请求进行处理。通过这种方式,是的服务器在遇到过量请求时,仍能正常处理请求,并恢复到一个正常的状态。当恢复正常时,可以将轮训时间间隔恢复正常。
Google中有一个该模式的实现:HttpRequest对象传递一个HttpBackOffUnsuccessfulResponseHandler

轮询VS推送

轮询:轮询请求,实时更新
推送:由服务端主动联系客户端,告诉发生了哪些变化。Google Cloud Messaging框架
改进轮询机制

  1. 由用户决定轮询时间间隔
  2. 使用AlarmManager实现轮询,这样系统会自动批量处理啊多个连接,减少无线电的活动时间。(有人说,这个不稳定)
  3. 应用一个退避指数算法,限制从服务端刷新数据的频率,减少非必要的链接。

所提供的API

当希望从客户端传输数据到服务器或者反过来,但是并不需要立即完成时。该框架预期,应用程序使用ContentProvider存储本地数据,并准备被同步到服务器。它可以将任务添加到一个队列,并在满足我们所设定的要求时执行他们。
ContentResolver.requestSync(), ContentResolver.setSyncAutonatically(),addPeriodicSync…等
验证器,同步适配器

Android N 带来的新变化

####流量节省程序 ####后台优化 显式BroadcastReceiver,组件有效期与创建的context一样
隐式BroadcastReceiver,从安装时就会注册,哪怕程序当前并不在运行中,系统也会启动应用程序,并发送对应的广播。
AndroidN 中,该action只会被以显示方式注册的组件所接受。可以再收到通知后,从后台发起一个请求,以更新获取内容中的数据。
GcmNetworkManager,注说已过期,目前用Firebase Cloud Messaging 来替代。?

调试工具

主要检查3个方面:

  1. 改变网络速度和延迟
  2. 以第三方视角,对请求属性进行分析
  3. 确保再应用程序的生命周期,没有执行非必要的传输

AndroidN网络ADB工具

Filddler

可以拦截请求并更改响应。

WireShank

可以用蓝牙、usb或者wifi热点来连接设备

Application Resource Optimizer

用于帮助我们找出应用程序网络策略中有带改进的地方。

网络衰减

模拟网络加速和延迟

Fiddler还可以改变网络延迟, network link condition, network attenuator