Android开发中页面可见的过期数据应如何刷新?
逻辑实现位置建议
放在ViewModel中实现,原因如下:
- 数据过期判断、重新计算都属于业务逻辑范畴,和Activity的UI交互逻辑无关,符合关注点分离的原则
- ViewModel的生命周期独立于Activity的配置变更(比如屏幕旋转、系统深色模式切换),不会因为Activity重建导致定时器被销毁重建,避免重复触发或者逻辑失效的问题
- Activity只需要观察LiveData的变化更新UI即可,不需要关心数据的过期、刷新逻辑,降低View层和业务逻辑的耦合度
定时器选型建议
不要使用java.util.Timer实现,该工具不会响应系统时间变更,且单线程运行出现异常会直接终止,可靠性较低。可以根据你的业务场景选择以下实现:
仅前台运行时需要刷新
如果只需要App处于前台、页面活跃时才需要触发午夜刷新,推荐使用Handler配合postDelayed实现:
- 先计算当前时间到当日午夜的毫秒数差值,作为延时参数
- 在ViewModel中创建绑定主线程Looper的Handler,post延时任务,任务中执行数据重新计算逻辑、更新LiveData
- 在ViewModel的
onCleared()回调中调用removeCallbacks()移除未触发的任务,避免内存泄漏 - 额外在Activity中注册
Intent.ACTION_DATE_CHANGED、Intent.ACTION_TIME_CHANGED广播,收到广播时通知ViewModel重新计算延时、重置定时任务,避免用户手动修改系统时间导致定时不准
需要后台提前刷新数据
如果需要App退到后台时也能在午夜完成数据刷新,下次打开页面直接展示最新数据,推荐使用Jetpack的WorkManager实现:
- 创建继承自
Worker的刷新任务类,在任务中执行数据计算、更新持久化缓存/对应LiveData的逻辑 - 构建
OneTimeWorkRequest,设置初始延时为当前到午夜的毫秒数,加入WorkManager队列执行 - WorkManager会自动处理系统时间变化、进程被杀后的任务重新调度,可靠性更高
注意事项
计算午夜时间戳时需要使用用户设备的本地时区计算,不要直接使用UTC时间,避免跨时区用户的触发时间不符合预期。
内容的提问来源于stack exchange,提问作者AndreKR
相关产品推荐
相关产品推荐

