根据Handler.postDelayed(Runnable r, long delayMillis)
的文件:
使Runnable r添加到要运行的消息队列中 经过指定的时间后。 runnable将运行 在这个处理程序附加到的线程上。
另一方面View.postDelayed(Runnable action, long delayMillis)
:
使Runnable被添加到消息队列中,以便在之后运行 指定的时间量过去了。 runnable将在。上运行 用户界面线程。
我想知道在从主线程调用它们时两者之间是否存在差异,特别是在活动被销毁时是否存在差异?
我已经阅读了这个article关于当我使用内部类处理程序时如何泄漏活动,我想知道使用View.postDelayed()
是否会导致同样的问题。
例如,foo()可能导致问题,还是活动的破坏会解决Runnable
匿名类持有对活动的引用的事实?
public class MyActiviy extends Activity {
private void foo(View v) {
v.postDelayed(new Runnable() {
public void run() {
// some delayed work
}
}, 60000);
finish();
}
}
答案 0 :(得分:8)
从源代码开始,View.postDelayed()
只是在内部处理程序上使用Handler.postDelayed()
,因此没有区别。
foo()
可能会泄露活动,您应该使用View.removeCallbacks()
来尽量减少这种机会。