runOnUiThread vs Looper.getMainLooper()。在Android中发布

任何人都可以告诉我,如果使用runOnUiThread()与Looper.getMainLooper()。post()在Android的UI线程上执行任务之间有任何区别?

我可以确定的唯一的事情是,因为runOnUiThread是一个非静态的Activity方法,所以当你需要在类中看不到Activity的时候,Looper.getMainLooper()。post()一个接口)。

我不是在寻找什么应该在UI线程上执行的讨论,我知道有些东西不能和很多东西不应该,但是有些东西(比如启动一个AsyncTask)必须从UI线程。

谢谢,
R.

从后台线程中调用以下行为

通过Looper.getMainLooper()

  Runnable task = getTask(); new Handler(Looper.getMainLooper()).post(task); 

通过Activity#runOnUiThread()

  Runnable task = getTask(); runOnUiThread(task); 

唯一的区别是当你从UI线程做到这一点以来

 public final void runOnUiThread(Runnable action) { if (Thread.currentThread() != mUiThread) { mHandler.post(action); } else { action.run(); } } 

将检查当前的线程是否已经是UI线程,然后直接执行它。 将其作为消息发布将延迟执行,直到您从当前的UI线程方法返回。

还有第三种方法在UI线程上执行一个Runnable ,它将是View#post(Runnable) – 即使从UI线程调用时,该线程也会始终发送消息。 这是有用的,因为这将确保View已经被正确地构造并且在代码被执行之前具有布局。