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

difference between Thread and 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();

先运行哪个??有人可以解释一下吗?

相同:你们都可以异步执行任务而不会阻塞你们当前的代码,

区别:假设你有一个Runnable r = new Runnable{...}

  • 当你使用new Thread(r).start()时,你实际上是异步创建了一个新线程和运行任务。

  • 当您使用 new Handler().post(r)(或 Message)时,您将 Runnable 对象添加到 Looper 并稍后在相同的位置执行代码线程.

一个Thread,一般MainThreadUIThread包含一个Looper。当MainThread 运行秒时,会循环Looper,一条条执行Runnable

首选线程时:

当您进行网络通信或解码大型位图文件等繁重工作时,首选新线程。如果需要很多线程,可能 ExecutorService 更受欢迎。 https://developer.android.com/reference/java/util/concurrent/ExecutorService.html

首选Handler时:

当你想从其他线程更新UI对象(如TextView文本)时,UI对象只能在UI线程中更新. 此外,当您稍后只想 运行 一些轻代码(例如延迟 300 毫秒)时,您可以使用 Handler 因为它更轻更快。

另请参阅Handler vs AsyncTask vs Thread

线程是可以完成大多数事情的通用处理任务,但它们不能做的一件事是更新 UI。

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

因此,例如通过发布到处理程序的消息 (Runnable) 显示祝酒词或更新进度条,但如果您将此 runnable 作为线程启动,则不能。

使用处理程序,您还可以进行 MessageQueuing、调度和重复等操作。

我还没有遇到需要线程的情况 android。

我主要结合使用 AsyncTasks 和 Handlers。

上述任务的处理程序。

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

Thread 实际上创建新线程 - 作业的一部分 运行 在后台相对于当前线程。

Handler 本身不提供任何后台作业机制——它只是一个访问与某个线程关联的消息队列 (Looper) 的工具。 UI 线程默认附加了 Looper,所以通常的做法是用 Handler.post(Runable) 更新 UI,这意味着在与此 [=] 关联的线程上执行一些代码11=].
一旦 Handler 服务于 Looper,就无法在没有关联 Looper.

的线程中创建它

简单地说,

两者是相同的概念,但存在一些关键差异。 线程是一个 java(java.lang) 概念,处理程序是一个 android(android.os)OS concept.if 您使用的是 Handler 而不是 Thread ,您的 OS 将自动管理后台进程的工作。但是如果你使用的是Thread,它并不依赖于你的android OS。因此与 Handler 相比,Threads 无法有效地管理内存。

线程:

您可以将新线程用于长时间的 运行 后台任务,而不会影响 UI 线程。来自 java 线程。但是在这里你不能从 Thread.

更新 UI

由于普通线程对 Android 体系结构没有多大用处,因此引入了用于线程的辅助程序 classes。 您可以在线程性能文档页面上找到问题的答案。

处理程序:

这个class负责将任何任务排入消息队列并处理它们。每个处理程序都可以与一个线程和该线程的消息队列相关联。

处理程序有两个主要用途:

  • 安排消息和可运行程序在某个时间点执行 未来;
  • 将要在不同的设备上执行的操作排队 线程比你自己的。

Looper: Looper是一个保持线程存活的worker,它循环消息队列并将消息发送到相应的Handler。

Message Queue:这个class保存了looper发送的消息列表。您只需调用 Looper.myqueue() 即可获取消息列表。我们一般不处理。