缓存
说道网络优化,不得不谈一谈缓存,各大网络开源框架中普遍使用到了缓存。
数据缓存
如何进行数据缓存,我们可以在返回上加上过期时间,避免重新获取。这种做法节约了流量,且大幅提高数据访问的速度,增强了用户体验。在OKHTTP
与Volley
等一些网络框架中都有很好的实践。
下面进行OKHTTP
,在无网络的情况下使用cache
进行缓存
增量数据更新
除了使用缓存,我们也可以采用增量数据更新的方式 比如: 1. 加上版本,当数据有明显变化的时候进行传输变化的数据,那些没有变化的就不进行传输,避免消耗网络流量 2. 或者在配置信息,省市,区这些地址信息的时候进行更新
数据压缩
数据压缩在网络优化中也进行普遍的使用
如何进行数据压缩呢,通常在post
请求体中加入gzip
等压缩字段。浏览器在发送请求时都会带着Accept-Encoding
头字段,里面是浏览器支持的压缩格式列表,例如 gzip、deflate、br
等,这样服务器就可以从中选择一种压缩算法,放进Content-Encoding
响应头里,再把原数据压缩后发给浏览器。
一些媒体资源传输的时候也可以进行压缩,比如图片上传前进行压缩,我们可以通过luban
库将本地的图片进行压缩,压缩后图片质量不变,加载压缩后的图片,再进行上传。
implementation 'top.zibin:Luban:1.1.8'
以下代码是为了演示Luban这个库对图片压缩对流量方面的影响 Luban.with(holder.imageView.getContext()) //加载需要压缩图片的位置 .load(Environment.getExternalStorageDirectory() "/Android/1.jpg") //将压缩为完的图片进行保存的位置,压缩完后的图片质量不变 .setTargetDir(Environment.getExternalStorageDirectory() "/Android") .launch();
图片除了压缩,还可以优先加载缩略图,使用webp
格式的图片减少图片的大小
DNS 优化
由于进行网络请求,可能会遇到DNS被劫持和DNS解析缓慢,造成网络请求过于耗时。
这里就可以采用HTTPDNS
来绕过运营商服务器解析过程,从而降低平均访问时长,提高连接率,进而提高网络访问的速度。
这里的HTTPDNS
不是使用传统的DNS
协议向服务器的53端口发送请求,而是使用Http
协议向服务器的80端口发送请求。
监控网络请求的质量
可以进行网络请求质量的监控,比如接口请求耗时,成功率或者错误码,图片的每一步加载的耗时
客户端进行请求耗时监控
public class OkHttpEvent { public long dnsStartTime; public long dnsEndTime; public long responseBodySize; public boolean apiSuccess; public String errorReason; }
Fresco框架 监控图片每一步加载耗时
facebook 的图片加载框架中通过继承RequestListener
监控图片请求加载流程,拿到图片加载的每一步
implementation 'com.facebook.fresco:fresco:1.11.0'
其他方案
除了以上常用的方案,我们也可以为进行进一步的网络优化,采取以下方案: 1. 采取CDN 加速,提高服务器带宽,动静资源分离(更新后清理缓存) 2. 根据时机不同,以及请求的频率减少传输量,降低服务器压力,增加网络传输速度