Android:我什么时候应该使用Handler(),什么时候应该使用Thread?

JRu*_*Run 126 multithreading android android-handler

当我需要异步运行某些东西时,例如长时间运行的任务或使用网络的逻辑,或者出于任何原因,启动新线程并运行它可以正常工作.创建一个处理程序并运行它也可以.有什么不同?我什么时候应该使用每一个?使用a Handler而不是a 的优点/原因是Thread什么?

PS.- 为了这个问题,让我们忽略AsyncTask.- Handler().postDelayed用例对我来说很清楚,对于这个问题,我们假设我需要立即启动任务.

Foa*_*Guy 164

如果你正在做的事情是"沉重的",你应该在一个线程中做.如果你没有在它自己的线程中明确地启动它,那么它将在主(UI)线程上运行,这可能会引起用户的紧张或缓慢响应界面.

有趣的是,当您使用线程时,通常也可以使用Handler作为您正在启动的工作线程与主线程之间的通信方式.

典型的Thread/Handler交互可能如下所示:

Handler h = new Handler(){
    @Override
    public void handleMessage(Message msg){
        if(msg.what == 0){
            updateUI();
        }else{
            showErrorDialog();
        }
    }
};

Thread t = new Thread() {
    @Override
    public void run(){
        doSomeWork();
        if(succeed){
            //we can't update the UI from here so we'll signal our handler and it will do it for us.
            h.sendEmptyMessage(0);
        }else{
            h.sendEmptyMessage(1);
        }
    }   
};
Run Code Online (Sandbox Code Playgroud)

一般来说,带回家是你应该在任何时候使用线程,这可能是长时间运行或非常密集(即任何网络,文件IO,重型算术等).

  • @JRun这是使用yes之一.[查看java文档中的处理程序描述](https://developer.android.com/reference/android/os/Handler.html)以获取有关它的一些很好的信息.包括其另一个用途(安排消息和runnables作为未来的某些点执行). (3认同)

ben*_*n75 61

处理程序和线程真的是两个不同的东西.

必须创建一个线程来执行长时间运行的作业.

Handler是两个线程之间进行通信的非常方便的对象(例如:后台线程需要更新UI.您可以使用Handler将一些Runnable从后台线程发布到UI线程).

因此,您无法在Handler或Thread之间进行选择.使用线程做繁重的工作!(如果你的后台线程会在另一个线程中触发一些工作,你可以使用一个Handler - 大多数时候是UI线程)


pie*_*fou 28

Handler并且Thread是两个不同的东西,但它们并不相互矛盾.你可以同时拥有a Handler和a Thread,实际上每个都Handler必须在a中运行Thread.

有关更多详细信息,您可能需要查看此文章.

在此输入图像描述


Pea*_*oto 18

A Handler运行在同Thread一个,Thread运行在不同的线程上.

如果需要在同一个线程上运行某些东西,通常是GUI元素或类似的东西,请使用Handler.

如果要保持主线程可以执行其他操作,请使用线程.将此用于需要大量时间的任何事情.

  • 如果我想在同一个线程上运行某些东西,为什么我应该使用一个处理程序?mHandler.post(...)方法的目的是什么? (6认同)

小智 13

处理程序是后台和UI线程之间最好的通信方式.通常,处理程序与线程的消息队列相关联,它们用于发送消息并可运行到消息.

使用:

线程:以比UI线程更多的saperate(背景)线程执行任务.(有助于解锁UI线程)

处理程序用于在UI和后台线程之间进行通信.

看看这篇文章