Android性能优化(五)网络优化
移动端APP几乎都是联网的,通过网络请求从服务端获取数据,网络的延迟等会对APP的性能产生较大的影响,网络优化除了可以节省网络流量,节省电量,还可以提高应用的响应,在Android平台上,可以采取以下措施来改善应用的网络请求。
避免DNS解析
DNS是域名系统,它的主要功能是根据应用请求所用的域名URL去网络上面映射表中查找对应IP地址,这个过程可能会需要上百毫秒的时间,而且可能会存在DNS劫持的危险,根据具体的业务需求,我们可以使用IP直连的方式来代替域名访问的方式,从而达到更快的网络请求,使用IP的坏处是不够灵活,当对应的服务因为某些原因IP地址发生变化后,客户端就访问不了了,因此IP方式需要增加动态更新的能力,或者在IP方式访问失败时,切换到域名访问方式。
合并网络请求
一次完整的HTTP请求,首先需要进行DNS查找,接着通过TCP三次握手,从而建立连接;如果是HTTPS请求,那么还需要经过TLS握手成功后连接才建立,因此对于网络请求应该尽量减少请求的接口,能够合并的网络请求就尽量合并。
预先获取数据
预先获取数据能够将网络请求集中在一次,这样其他时间段手机就可以切换到空闲状态,从而避免经常性的唤醒和空闲,起到节省电量的作用。
避免轮询
轮询是指客户端每隔一段时间就向服务端主动发起的网络请求,如果存在需要的数据就拉取,没有的话就继续等待下一次轮询,一般情况下不建议在应用中使用轮询操作,能够使用推送来替换的尽量使用推送,在不得已的情况下,也要避免使用Thread.sleep()函数来循环等待,比较好的做法是使用系统AlarmManager来实现定时轮询,AlarmManager可以保证在系统休眠时CPU也可以得到休眠,在下一次需要发去网络请求的时候才唤醒。
优化重连机制
尽量避免在网络请求失败时,无限制的循环重试连接,可以设定一个最大重连次数,超过次数限制之后结束重连,等一段较长时间后在尝试连接,或者把是否重连的问题抛给使用者根据具体的业务需求确定。
离线缓存
对于类似图片,文件等数据,可以使用内存缓存+外存缓存的方式实现二级缓存策略,当在缓存中命中对应的图片或者文件时,直接从缓存中读取,无需走网络请求,不仅避免了网络延迟,还节省了用户的流量,在Android 中,典型的是使用LruCache实现内存缓存,DiskLruCache实现外存缓存,对于图片,已经有很多开源框架可供选择。
压缩数据大小
从节省网络流量和提高应用响应等方面出发,我们需要减少网络上面传输的数据,对于客户端来说,可以对发送给服务端的数据进行gzip压缩,同时可以选用更优的数据传输格式,例如可以使用二进制方式代替JSON格式,使用WebP图片格式代替JPEG或者PNG图片格式等。
不同的网络环境使用不同的超时策略
应用中应该根据当前的网络类型来设置不同的网络超时时间,常见的网络类型有2G,3G,4G和WIFI,为了实时更新当前网络类型,可以通过监听ConnectivityManager,CONNECTIVITY_ACTION的变化来获取最新的网络类型,并动态调整网络超时时间。
CDN的使用
CDN全程是内容分发网络,它的基本思想是尽可能避免网络上可能影响数据传输速度和稳定性的环节,从而实现更快更稳定的数据传输,CDN加速能够缓解电信核心网络延迟带来的影响。