Android中除Handler外如何用Retrofit持续调用API拉取最新数据?
队列展示类App数据更新方案
原Handler定时轮询的核心问题除了服务端负载高、内存泄漏,还有无效请求多、功耗高的问题,以下是可落地的更优方案:
1. 短轮询优化方案(适配服务端暂不支持推送的场景)
如果暂时无法改造服务端逻辑,可以对原有轮询做优化,解决现有问题:
- 替换Handler定时逻辑,用
WorkManager或协程Flow实现生命周期感知的轮询,仅在对应页面前台展示时发起请求,页面退后台/销毁时自动停止请求,从根源避免内存泄漏 - 动态调整轮询间隔:连续2-3次请求返回数据无更新时,逐步拉长轮询间隔(最高可到30s),检测到数据更新后立即切回短间隔,可降低70%以上的无效请求
- 每次请求带上上次接口返回的
ETag或Last-Modified标识,服务端数据无更新时直接返回304状态码,不传输全量数据,同时降低两端带宽消耗
2. 服务端推送方案(优先推荐,彻底替代轮询)
改造服务端逻辑,有数据更新时主动推送给客户端,完全避免客户端主动轮询的开销:
WebSocket长连接
客户端和服务端建立WebSocket长连接,队列数据更新时服务端直接推送增量/全量数据到客户端,数据延迟可控制在毫秒级,服务端仅需维持长连接心跳,负载远低于短轮询。安卓端可直接用OkHttp内置的WebSocket实现,绑定页面生命周期,销毁时主动关闭连接即可,无内存泄漏风险。SSE(Server-Sent Events)
如果仅需要服务端向客户端单向推送数据,无需客户端实时上行交互,SSE比WebSocket更轻量,本身基于HTTP协议,服务端改造成本极低,安卓端用OkHttp的流读取能力即可直接解析SSE事件。系统级推送通道
如果需要App在后台也能感知队列更新,可接入对应厂商的系统推送通道(小米推送、华为推送、FCM等),服务端有更新时先通过通道发静默通知给客户端,客户端收到后再拉取最新数据更新,比客户端后台保活轮询的功耗低90%以上。
补充降级策略:无论采用哪种推送方案,都要配置异常降级逻辑,长连接/推送通道断开时自动切换到优化后的短轮询,通道恢复后再切回推送模式,避免数据断更。
内容的提问来源于stack exchange,提问作者Liew Syet Chau
相关产品推荐
相关产品推荐

