线程和处理程序之间的区别

35

有人可以告诉我 "Thread" 和 "Handler" 之间的区别吗?我们什么时候使用 "Thread",什么时候使用 "Handler"?

我的项目中有两段代码,但我不理解它们。

final Handler handler =  new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        //  Do SomeThings
    } 
};

并且

private class readThread extends Thread
{
    Handler mHandler;

    readThread(Handler h){
        mHandler = h;
        this.setPriority(Thread.MIN_PRIORITY);

    }

    @Override
    public void run()
    {
        //  Do SomeThings
    }
}

在另一个方法调用中可以像这样调用处理程序

read_thread = new readThread(handler);
            read_thread.start();

哪个先运行?有人能给我解释一下吗?


你在readThread中没有使用mHandler字段,那么它的作用是什么? - pskink
我不知道。我对这些代码一无所知。我正在努力理解它们。 - Khodayar
5个回答

72
相同点:你都可以在不阻塞当前代码的情况下异步执行任务。 不同点:假设你有一个Runnable r = new Runnable{...}
  • 当你使用new Thread(r).start()时,实际上是创建了一个新的线程并异步运行任务。

  • 当你使用new Handler().post(r)(或者Message)时,你将Runnable对象添加到Looper中,稍后在同一线程中执行代码。

Thread一般包含一个Looper,如MainThreadUIThread。当MainThread运行时,它会循环Looper并逐个执行Runnable

何时使用Thread:

当你正在进行像网络通信或解码大型位图文件这样的重度工作时,建议使用新线程。如果需要许多线程,也许ExecutorService更加合适。 https://developer.android.com/reference/java/util/concurrent/ExecutorService.html

何时使用Handler:

当你想要从其他线程更新UI对象(如TextView文本)时,必须在UI线程中更新UI对象。 此外,当你只想稍后运行一些轻量级代码时(如延迟300ms),可以使用Handler,因为它更轻量级和更快速。

请参考Handler vs AsyncTask vs Thread


7

Thread 实际上是创建新的线程 - 在与当前线程相对应的后台运行任务的一部分。

Handler 本身并不提供任何后台作业机制 - 它只是访问与某个线程相关联的消息队列 (Looper) 的工具。UI 线程默认附加了 Looper,因此通常使用 Handler.post(Runnable) 更新 UI,这意味着在与此 Handler 相关联的线程上执行一些代码。
只要 Handler 服务于 Looper,就不能在没有关联 Looper 的线程中创建它。


5

线程是通用的处理任务,可以做大多数事情,但它们无法更新UI。

另一方面,处理程序是后台线程,允许您与UI线程通信(更新UI)。

例如,通过发送到处理程序的消息(Runnable)显示toast或更新进度条,但如果将此可运行项作为线程启动,则无法执行此操作。

使用处理程序,您还可以拥有诸如消息队列、调度和重复等功能。

我尚未遇到需要在android中使用线程的情况。

我主要使用AsyncTasks和Handlers的组合。

处理程序用于上述任务。

AsyncTasks用于下载/数据获取和轮询等操作。


3

简单来说,

两个概念是相同的,但有一些关键的区别。 Thread 是一个 Java(java.lang) 的概念,而 Handler 是一个 Android(android.os)操作系统 的概念。如果你使用 Handler 而不是 Thread,你的操作系统将自动管理后台进程的工作。但是如果你使用 Thread,则它不依赖于你的 Android 操作系统。因此,与 Handler 相比,Thread 不能有效地管理内存。


2

线程:

您可以使用新的Thread执行长时间的后台任务,而不会影响UI线程。来自java Thread。但是,在此期间无法从Thread更新UI。

由于普通的Thread对于Android架构并不是很有用,因此引入了辅助线程类。您可以在Threading性能文档页面上找到您的查询答案。

处理程序:

该类负责将任何任务排队到消息队列并处理它们。每个Handler可以与一个单独的线程及其线程的消息队列相关联。

Handler有两个主要用途:

  • 将消息和可运行项安排在未来的某个时刻执行;
  • 将操作排队以在与您自己不同的线程上执行。

enter image description here

Looper:Looper是一个工作线程,可以保持线程活跃,它循环遍历消息队列并将消息发送到相应的Handler。

消息队列:这个类保存要由looper分发的消息列表。您只需调用Looper.myqueue()即可获取消息列表,一般情况下我们不需要直接操作它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接