Thread和Handler之间的区别

Kho*_*yar 22 multithreading android handler

有人可以告诉我Thread和Handler之间的差异吗?当我们使用Thread并使用Handler时?

我的项目中有两个代码,但我无法理解它们.

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

private class readThread extends Thread
{
    Handler mHandler;

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

    }

    @Override
    public void run()
    {
        //  Do SomeThings
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个方法中调用这样的处理程序

read_thread = new readThread(handler);
            read_thread.start();
Run Code Online (Sandbox Code Playgroud)

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

yjz*_*ang 51

相同:您可以异步执行任务而不会阻止当前代码,

区别:想象一下,你有一个Runnable r = new Runnable{...}

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

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

A Thread,一般MainThreadUIThread包含一个Looper.当MainThread运行时,它会循环的Looper,并执行Runnable一个接一个.

当首选Thread时:

当您正在进行大量工作(如网络通信)或解码大型位图文件时,首选新线程.如果需要很多线程,可能ExecutorService会更进一步. https://developer.android.com/reference/java/util/concurrent/ExecutorService.html

当Handler是首选时:

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

另请参阅Handler vs AsyncTask vs Thread


Dar*_*try 6

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

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

例如,通过发布到处理程序的消息(可运行)显示吐司或更新进度条,但如果将此可运行作为线程启动,则不能。

通过处理程序,您还可以进行消息队列、调度和重复等操作。

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

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

上述任务的处理程序。

用于下载/数据获取和轮询等的异步任务。


Via*_*lav 5

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

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