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

根据以下文件:Handler.postDelayed(Runnable r, long delayMillis)

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

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

将 Runnable 添加到消息队列中,以便在指定的时间过后运行。可运行对象将在用户界面线程上运行。

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

我已经阅读了这篇文章,关于当我使用内部类处理程序时,我可能如何泄漏活动,我想知道使用是否会导致同样的问题。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();
    }
}

答案 1

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

foo()可能会泄漏活动,您应该使用以尽量减少这种机会。View.removeCallbacks()


答案 2

推荐