Java 当运行线程时,处理程序做什么?

Java 当运行线程时,处理程序做什么?,java,android,Java,Android,我真的对此感到困惑,但当我从我的SurfaceView触发线程时,我会发送一个具有如下构造函数的处理程序 private static Thread thread; public SurfaceView(Context localContext) { //other stuff thread = new Thread(mySurfaceHolder, myEngine, this, new Handler()); //other stuff } 在我的th

我真的对此感到困惑,但当我从我的SurfaceView触发线程时,我会发送一个具有如下构造函数的处理程序

private static Thread thread;

public SurfaceView(Context localContext) {
      //other stuff
      thread = new Thread(mySurfaceHolder, myEngine, this, new Handler());
      //other stuff
}
在我的thread类中,我使用从视图发送的处理程序分配一个处理程序对象,如下所示:

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

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

}
那么这个处理器做什么呢?我从来没有在我的线程类中以任何方式使用它,那么为什么web上的示例仍然向我显示我应该发送一个带有构造函数的处理程序呢? 我看不到连接。

来自:

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


通常,如果您需要执行一些应该严格在UI线程上运行的代码,则需要将线程通信回UI。

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

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

自从Android API 3以来,就有了,这使得后台和UI之间的通信更加容易,并且减少了使用处理程序的需要

示例:

  • 有关使用处理程序的示例, 看
  • 另请参见,其中包含指向使用线程的示例项目的链接

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

Handler mUIHandler = new Handler();

现在,您可以立即发布到
mUIHandler
,它始终会进入您的UI线程

好的,但是我(在我的申请中)没有这个用途?我需要处理程序在UI中执行哪种代码?例如,只能从UI线程显示祝酒词和对话框。我打赌还有其他的案子。Thread类当然扩展了Thread.:)你能提供一个例子吗?我做任何与UI相关的事情,只是为了更好地了解?好吧,这是一种在处理程序的帮助下更新(游戏编码视角)分数的方法?@Julien Assange:这是访问用户可见的任何东西。如果分数显示在TextView中,则需要在UI线程上更新TextView。另一个例子是显示ProgressDialog。好的,谢谢您的回答!:-)现在接受!也许我会在这里对此发表评论,这取决于它如何与这件事。我仍然不知道这会有什么用处?在哪种情况下?对不起,我一点也不明白。:-)没问题,真是让人大吃一惊。假设你有一个下载东西的线程。要显示这些内容,您可能希望downloader线程在屏幕上显示这些内容。要做到这一点,您必须将更改发布到主UI线程,而不能从downloader线程进行这些更改。这有帮助吗?换句话说,处理程序执行您发布到它的“runnable”。它在主UI线程上执行此操作。您可以定义runnable,例如更新屏幕上的文本或进度条。处理程序接受该runnable并执行它。UI线程会影响用户体验,因此在其中做太多的事情对用户体验有害。