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
已经被正确地构造并且在代码被执行之前具有布局。