我正在RecyclerView
列表项中使用一个处理程序来显示一个计时器。当我按回承载RecyclerView
的Activity
时,Handler()
将被完全破坏,Handler()
仍在后台运行。处理程序在ViewHolder
中创建并初始化。有没有办法从ViewHolder
本身中删除处理程序的回调?
My ViewHolder示例代码
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), CustomRunnable.CustomRunnableListener{
private val handler = Handler()
lateinit var customRunnable: CustomRunnable //custom runnable for my timer logic
fun bind(position: Int, listModelClass: ModelClass?){
if(someCondition){
customRunnable = CustomRunnable(handler, this, textView, listModelClass)
handler.postDelayed(customRunnable, 1000)
}
}
override fun onTimerFinish(listModelClass: ModelClass) {
// I get this call back when the timer finishes
handler.removeCallbacks(customRunnable)
}
}
4条答案
按热度按时间llew8vvj1#
据我所知,当
RecyclerView
从活动中分离时,适配器上没有调用的方法。尝试在
BaseActivity
或Application
类中创建一个计时器对象或对象列表,并在按下onBack后运行一个停止该计时器的方法。pwuypxnk2#
您可以在活动的**onDestory()**中执行此操作
删除obj为token的回调和已发送消息的任何挂起发布。如果token为null,则将删除所有回调和消息。
rhfm7lfc3#
如果您的Activity是从
androidx.activity.ComponentActivity
扩展而来的,那么您可以轻松地做到这一点,只需绑定生命周期事件,然后超类就会按照您的要求完成它们的工作,示例代码如下所示:rmbxnbpk4#
销毁Activity时,将列表适配器设置为null。这将确保在销毁Activity时为列表中的所有视图调用onViewDetachedFromWindow。
然后,您可以从viewHolder内部运行的处理程序中删除回调。这需要您将处理程序引用保存在viewHolder内部。