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

时间:2017-01-18 20:35:59

标签: java android multithreading android-handler

根据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();
    }
}

1 个答案:

答案 0 :(得分:8)

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

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