主线程上的View.postDelayed()和Handler.postDelaayed()有什么区别



根据Handler.postDelayed(Runnable r, long delayMillis):的文档

使Runnable r添加到消息队列中,以便运行在经过指定的时间量之后。可运行程序将运行在附加此处理程序的线程上。

另一方面View.postDelayed(Runnable action, long delayMillis):

使Runnable添加到消息队列中,在经过了指定的时间量。可运行程序将在用户界面线程。

我想知道从主线程调用它们时两者之间是否有区别,特别是当活动被破坏时是否有区别?

我读过这篇文章,讲的是当我使用内部类处理程序时如何泄漏Activity,我想知道使用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();
}
}

从源代码来看,View.postDelayed()只是在内部处理程序上使用Handler.postDelayed(),所以没有区别。

foo()可能会泄漏"活动",您应该使用View.removeCallbacks()将此机会降至最低。

最新更新