Handler在运行线程时做了什么?

时间:2010-08-20 13:46:50

标签: java android

我真的对此感到困惑,但是当我从SurfaceView中触发一个线程时,我发送一个带有这样的构造函数的Handler

private static Thread thread;

public SurfaceView(Context localContext) {
      //other stuff
      thread = new Thread(mySurfaceHolder, myEngine, this, new Handler());
      //other stuff
}

在我的线程类中,我使用我从视图发送的处理程序分配一个Handler对象,如下所示:

    public Thread (SurfaceHolder lHolder,
    Engine lEngine,
    View lView,
    Handler lHandler){

    surfaceHolder = lHolder;
    engine = lEngine;
    view = lView;
    handler = lHandler;

}

那么这个Handler会做什么?我从来没有在我的线程类中以任何方式使用它,那么为什么网上的例子仍然告诉我我应该用构造函数发送一个处理程序? 我看不到这种联系。

3 个答案:

答案 0 :(得分:5)

来自Handler docs

  

当为您的应用程序创建进程时,其主线程专用于运行消息队列,该队列负责管理顶级应用程序对象(活动,广播接收器等)以及它们创建的任何窗口。您可以创建自己的线程,并通过Handler与主应用程序线程进行通信。这是通过调用与以前相同的post或sendMessage方法完成的,但是来自您的新线程。给定的Runnable或Message将在Handler的消息队列中进行调度,并在适当时进行处理。

通常需要从您的线程回传到UI,以防您需要执行一些严格在UI线程上运行的代码。

答案 1 :(得分:3)

我假设您的代码中正在扩展Thread,因为没有构造函数为Thread类提供处理程序。处理程序用于与UI线程进行通信,因为Android线程模型需要在特殊专用线程上执行UI操作。

创建新线程时,代码在后台线程中执行,因此UI操作不安全。如果您不需要执行与UI相关的任何操作,则可以删除处理程序。

从Android API 3开始,有AsyncTask,这使得后台和UI之间的通信变得更加容易,并减少了使用处理程序的需要。

示例:

  • 有关使用处理程序的示例, 见this
  • 另请参阅Painless Threading,其中包含使用线程的示例项目的链接。

答案 2 :(得分:2)

只需将主要活动中的处理程序定义为全局。

Handler mUIHandler = new Handler();

现在您可以立即发布到mUIHandler并始终转到您的UI线程。