Kotlin中如何让TimerTask每5秒重复执行,实现定时刷新RecyclerView?
问题原因
你调用的是双参数的Timer.schedule()重载,该方法仅支持延迟指定时间后执行1次任务,未配置重复执行间隔,所以不会循环触发。
解决方案
1. 修改Timer初始化逻辑
首先把Timer声明为Fragment的全局成员变量,方便后续生命周期管理,同时调用三参数的schedule重载实现重复执行,示例代码如下:
// Fragment全局声明Timer变量,可空方便销毁时置空 private var funtimer: Timer? = null override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 可选:页面初始化时先执行一次拉取,不需要等5秒首次延迟 jsonParse() funtimer = Timer() // schedule参数说明:要执行的任务、首次执行的延迟时间、两次执行的间隔时间,单位均为毫秒 funtimer?.schedule(timerTask { jsonParse() }, 5000, 5000) }
2. 补充生命周期适配,避免内存泄漏
需要在Fragment销毁视图时停止定时器,避免页面销毁后后台仍继续请求、引发空指针崩溃或者内存泄漏:
override fun onDestroyView() { super.onDestroyView() // 停止定时器任务并回收资源 funtimer?.cancel() funtimer = null }
额外注意点
- Timer的任务默认运行在子线程,你当前代码中用Volley发起网络请求,请求的成功/失败回调自动切换到主线程更新UI,不会出现子线程操作UI的崩溃;如果后续需要直接在
timerTask中操作视图,需要通过Handler或者view.post{}手动切换到主线程。 - 如果需要更稳定的后台轮询能力,可替换为Coroutine定时任务或者WorkManager实现,Timer存在系统后台回收后停止运行、单任务异常会终止整个定时器的问题。
内容的提问来源于stack exchange,提问作者trainmania100
相关产品推荐
相关产品推荐

