网络请求是 App 耗电和流量的主要来源之一。同样的接口,优化前后可能差几倍。今天聊一些工程上立竿见影的做法。
一、连接复用:HTTP/2 和连接池
val client = OkHttpClient.Builder()
.protocols(listOf(Protocol.HTTP_2, Protocol.HTTP_1_1))
.connectionPool(ConnectionPool(5, 5, TimeUnit.MINUTES))
.build()
HTTP/2 支持多路复用,一个 TCP 连接上可以并发多个请求。服务器如果支持,尽量开启。
二、请求合并与批量
合并接口:把多个小接口合成一个
批量拉取:列表用分页,不要一次拉全量
去重请求:同一个接口并发调用时只发一次
// 用相同的 Call 对象,OkHttp 默认会复用连接
三、缓存策略
val cache = Cache(context.cacheDir, 50L * 1024 * 1024)
val client = OkHttpClient.Builder()
.cache(cache)
.addInterceptor(cacheInterceptor)
.build()
合理设置 Cache-Control:
不变数据:设置较长 max-age
敏感数据:不缓存
列表数据:用 ETag/Last-Modified 做协商缓存
四、弱网适配
val request = chain.request()
if (!isNetworkAvailable()) {
request.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=86400")
.build()
}
弱网策略:
超时重试:连接超时、读取超时分开设
降级策略:弱网时切换低清图片、减少预加载
请求优先级:关键请求优先,非关键请求延后
五、监控网络质量
记录每个接口的耗时、成功率
按网络类型分类统计(WiFi/4G/5G)
发现慢接口和失败率高的接口
用 APM 或自定义拦截器实现
小结
HTTP/2 和连接池能显著提升连接效率
合并接口、批量拉取、去重能减少请求数
合理缓存能降低重复请求
弱网适配需要超时、降级、优先级策略
下一篇,我们看看电量优化:Doze、Standby 与后台限制。
参考阅读
引用链接
[1]OkHttp 缓存文档: https://square.github.io/okhttp/features/caching/
[2]Network monitoring: https://developer.android.com/topic/performance/power/network