Android 如果使用View.postDelayed()会自动删除可运行项吗
正如我所知,反复调用Android 如果使用View.postDelayed()会自动删除可运行项吗,android,Android,正如我所知,反复调用Handler.postDelayed()(再次在同一个runnable中调用postDelayed())可能会导致线程持有的某些实例永远无法释放 如果我使用View.postDelayed()添加一个runnable,我是否有责任调用View.removeCallbacks()以避免内存泄漏?或者,当视图被“销毁”时,runnable是否会从队列中删除 或者,当视图打开时,是否会从队列中删除可运行的 “毁灭” 这是你的责任。runnable将挂起在队列中,直到您显式删除它或
Handler.postDelayed()
(再次在同一个runnable中调用postDelayed()
)可能会导致线程持有的某些实例永远无法释放
如果我使用View.postDelayed()
添加一个runnable,我是否有责任调用View.removeCallbacks()
以避免内存泄漏?或者,当视图被“销毁”时,runnable是否会从队列中删除
或者,当视图打开时,是否会从队列中删除可运行的
“毁灭”
这是你的责任。runnable将挂起在队列中,直到您显式删除它或执行它(如果runnable没有在队列中发布自己)。我强烈建议您致电
removeCallbacks
。如果您正在对视图进行子类化,则可以使用onDetachedFromWindow()
谢谢您的回答,onDetachedFromWindow()非常棒。现在,我可以使我的一些代码更加优雅。我还有另一个问题:我编写了一个util类来对任意视图执行一些动画,并在Activity.onDestroy()中调用类似stopAnim()的函数来删除可运行项(“显式删除它”)。但是我认为让util类的用户显式地完成发布工作有点难看。有没有办法知道视图何时不再使用?我找到了一种方法,但不知道它是否合适。在Runnable.run()的开头,尝试使用View.getWindowToken()获取窗口标记。如果为null,则退出循环。到目前为止对我有效。有没有办法知道视图何时不再使用?如果要对视图进行子类化,则应使用ondAttachedFromWindow()
删除/取消注册