Activity.runOnUiThread(runnable action)和Handler.post()之间有什么区别?

时间:2009-12-03 12:35:28

标签: android

在android中使用Activity.runOnUiThreadHandler.post(runnable action)之间有什么区别/优点/缺点?

3 个答案:

答案 0 :(得分:23)

Activity.runOnUiThread,就像它的名字所暗示的那样,将在当前负责UI的线程中执行Runnable。因此,如果您有CPU密集型任务,它可能会使UI在短时间内无响应。相反,Handler提供了一种方法来创建线程,运行一些代码,并在完成后通知UI(即Handler.sendMessage)。

Handler的文档比我更好地说明了这一点:

  

为您的流程创建流程时   应用程序,它的主要线程是   致力于运行消息队列   负责管理   顶级应用程序对象   (活动,广播接收器等)   以及他们创造的任何窗户。您可以   创建自己的线程,和   与主要沟通   应用程序线程通过Handler。   这是通过调用同一个帖子来完成的   或者像以前一样使用sendMessage方法   从你的新线程。给定的   Runnable或Message将是   在Handler的消息中安排   排队并在适当的时候进行处理。

答案 1 :(得分:0)

Activity.runOnUiThread()是更通用的处理程序的特例。使用Handler,您可以在自己的线程中创建自己的事件查询。使用使用默认构造函数实例化的处理程序并不代表"代码将在UI线程上运行"一般来说。默认情况下,处理程序绑定到从中实例化的Thread。 要创建保证绑定到UI(主)线程的Handler,您应该创建绑定到Main Looper的Handlerobject,如下所示:

Handler mHandler = new Handler(Looper.getMainLooper());

此外,如果你检查runOnuiThread()方法的实现,它正在使用Handler来做这些事情:

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

正如您从上面的代码片段中看到的,如果从UI线程调用runOnUiThread(),则会立即执行Runnable操作。否则,它会将其发布到Handler,稍后将在某个时间执行。

答案 2 :(得分:0)

请参见here。如果在UiThread中立即调用runOnUiThread(),则在处理完所有消息后将调用post()。如果不在其他线程中,则runOnUiThread()post()相同。

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