我有点困惑处理器,AsyncTask和线程之间的区别在Android。我在StackOverflow上读过不少博客和问题。

Handler是后台线程,为您提供与UI通信。例如,更新进度条应该通过Handler来完成。使用Handlers可以获得MessagingQueues的优势,因此如果您想调度消息或更新多个UI元素或有重复任务。

AsyncTask是类似的,事实上,他们利用Handler,但不运行在UI线程,所以它很适合抓取数据,例如抓取web服务。稍后您可以与UI交互。

然而,线程不能与UI交互,提供更多的“基本”线程,你错过了AsyncTask的所有抽象。

但是,我希望在服务中运行套接字连接。这应该运行在一个处理程序或线程,甚至一个AsyncTask?UI交互根本不需要。它对我使用的性能有影响吗?

同时,文档也得到了很大的改进。


当前回答

这取决于选择哪一个是基于需求的

Handler主要用于从其他线程切换到主线程,Handler附加到一个循环器,它在队列中发布其可运行任务。 所以如果你已经在其他线程和切换到主线程,那么你需要处理而不是异步任务或其他线程

如果在主线程之外创建的Handler不是一个looper,则不会在线程创建Handler时给出错误,该线程需要被创建为lopper

AsyncTask用于执行在后台线程上运行的代码,并将其结果传递给主线程 ** *异步任务限制 1. 异步任务不附加到活动的生命周期,即使它的活动被破坏,它也会继续运行,而加载器没有这个限制 2. 所有异步任务共享相同的后台线程执行,这也会影响应用程序的性能

线程在应用程序中用于后台工作,但它在主线程上没有任何回调。 如果要求适合一些线程,而不是一个线程,需要给任务很多次,那么线程池执行器是更好的选择。Eg要求图像加载从多个url像滑翔。

其他回答

线程:

你可以在不影响UI线程的情况下使用新的线程来执行长期运行的后台任务。从java线程,你不能更新UI线程。

由于普通线程在Android架构中用处不大,因此引入了线程的辅助类。

您可以在线程性能文档页面中找到查询的答案。

处理程序:

Handler允许您发送和处理与线程的MessageQueue关联的Message和Runnable对象。每个Handler实例都与单个线程和该线程的消息队列相关联。

Handler有两个主要用途:

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

AsyncTask:

AsyncTask允许正确和简单地使用UI线程。该类允许您执行后台操作并在UI线程上发布结果,而无需操作线程和/或处理程序。

缺点:

默认情况下,应用程序将它创建的所有AsyncTask对象推入一个线程。因此,它们以串行方式执行,与主线程一样,一个特别长的工作包会阻塞队列。由于这个原因,使用AsyncTask来处理持续时间短于5毫秒的工作项。 AsyncTask对象也是隐式引用问题的最常见的肇事者。AsyncTask对象也存在与显式引用相关的风险。

HandlerThread:

您可能需要一种更传统的方法来在长时间运行的线程上执行工作块(不像AsyncTask,它应该用于5ms的工作负载),并且需要一些手动管理工作流的能力。处理程序线程实际上是一个长时间运行的线程,它从队列中获取工作并对其进行操作。

ThreadPoolExecutor:

该类管理一组线程的创建,设置它们的优先级,并管理如何在这些线程之间分配工作。随着工作负载的增加或减少,该类将启动或销毁更多的线程以适应工作负载。

如果工作负载比较大,单个HandlerThread不够用,那么可以使用ThreadPoolExecutor

然而,我想有一个套接字连接运行在服务。这应该运行在一个处理程序或线程,甚至一个AsyncTask?UI交互根本不需要。它对我使用的性能有影响吗?

因为UI交互不是必需的,你可能不需要AsyncTask。普通线程用处不大,因此HandlerThread是最好的选择。因为你必须维护套接字连接,主线程上的Handler一点用都没有。创建一个HandlerThread并从HandlerThread的循环程序中获取一个Handler。

 HandlerThread handlerThread = new HandlerThread("SocketOperation");
 handlerThread.start();
 Handler requestHandler = new Handler(handlerThread.getLooper());
 requestHandler.post(myRunnable); // where myRunnable is your Runnable object. 

如果希望与UI线程通信,可以使用另外一个Handler来处理响应。

final Handler responseHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            //txtView.setText((String) msg.obj);
            Toast.makeText(MainActivity.this,
                    "Foreground task is completed:"+(String)msg.obj,
                    Toast.LENGTH_LONG)
                    .show();
        }
    };

在Runnable中,您可以添加

responseHandler.sendMessage(msg);

关于实现的更多细节可以在这里找到:

Android:在线程中吐司

线程

当你启动一个应用程序时,会创建一个进程来执行代码。为了有效地利用计算资源,可以在进程内启动线程,以便同时执行多个任务。所以线程允许你通过有效地利用cpu而没有空闲时间来构建高效的应用程序。

在Android中,所有组件都在一个称为主线程的线程上执行。Android系统将任务排队,并在主线程中逐个执行。当长时间运行的任务执行时,应用程序变得无响应。

为了防止这种情况,您可以创建工作线程并运行后台或长时间运行的任务。

由于android使用单线程模型,UI组件是创建非线程安全的,这意味着只有它创建的线程应该访问它们,这意味着UI组件应该只在主线程上更新。由于UI组件运行在主线程上,运行在工作线程上的任务不能修改UI组件。这就是Handler出现的地方。Handler在Looper的帮助下可以连接到新线程或现有线程,并在连接的线程上运行它包含的代码。

处理器使线程间通信成为可能。后台线程可以通过Handler将结果发送给后台线程,连接到主线程的Handler可以更新主线程上的UI组件。

AsyncTask

AsyncTask提供的android使用线程和处理程序,使运行简单的任务在后台和更新结果从后台线程到主线程容易。

请参见android thread, handler, asynctask和线程池的例子。

如果我们看一下源代码,就会发现AsyncTask和Handler完全是用Java编写的。(不过也有一些例外。但这不是重点)

所以在AsyncTask或Handler中没有什么魔力。这些类使开发人员的工作更加轻松。

例如:如果程序A调用方法A(),方法A()可以在程序A的不同线程中运行。我们可以通过以下代码轻松验证:

Thread t = Thread.currentThread();    
int id = t.getId();

为什么我们应该使用一个新线程的一些任务?你可以为它谷歌。很多很多原因,e。G:起重、长时间工作。

那么,线程,AsyncTask和处理程序之间的区别是什么?

AsyncTask和Handler是用Java写的(在内部它们使用线程),所以我们可以用Handler或AsyncTask做的所有事情,我们也可以使用线程来实现。

Handler和AsyncTask能真正帮助什么?

最明显的原因是调用线程和工作线程之间的通信。 调用线程:调用工作线程执行某些任务的线程。调用线程不一定是UI线程)。当然,我们可以用其他方式在两个线程之间进行通信,但是由于线程安全,存在许多缺点(和危险)。

这就是为什么我们应该使用Handler和AsyncTask。这些类为我们做了大部分工作,我们只需要知道要重写哪些方法。

Handler和AsyncTask之间的区别是:当Caller线程是一个UI线程时使用AsyncTask。 这是android文档说的:

AsyncTask允许正确和简单地使用UI线程。这个类 允许执行后台操作,并在UI上发布结果 线程,而不必操作线程和/或处理程序

我想强调两点:

1)易于使用UI线程(所以,当调用线程是UI线程时使用)。

2)不需要操纵处理程序。(意思是:你可以使用Handler而不是AsyncTask,但AsyncTask是一个更简单的选择)。

在这篇文章中有很多东西我还没有说,例如:什么是UI线程,或者为什么它更容易。你必须知道每个类背后的一些方法并使用它,你才会完全理解其中的原因。

@:当你阅读Android文档时,你会看到:

Handler允许您发送和处理Message和Runnable对象 与线程的messagqueuue相关联

这种描述乍一看可能很奇怪。我们只需要了解每个线程都有每个消息队列(就像一个待办事项列表),并且线程将接收每条消息,直到消息队列为空(就像我们完成工作并上床睡觉一样)。因此,当Handler通信时,它只是给调用线程一个消息,它将等待处理。

复杂?只要记住Handler可以安全地与调用线程通信。

这取决于选择哪一个是基于需求的

Handler主要用于从其他线程切换到主线程,Handler附加到一个循环器,它在队列中发布其可运行任务。 所以如果你已经在其他线程和切换到主线程,那么你需要处理而不是异步任务或其他线程

如果在主线程之外创建的Handler不是一个looper,则不会在线程创建Handler时给出错误,该线程需要被创建为lopper

AsyncTask用于执行在后台线程上运行的代码,并将其结果传递给主线程 ** *异步任务限制 1. 异步任务不附加到活动的生命周期,即使它的活动被破坏,它也会继续运行,而加载器没有这个限制 2. 所有异步任务共享相同的后台线程执行,这也会影响应用程序的性能

线程在应用程序中用于后台工作,但它在主线程上没有任何回调。 如果要求适合一些线程,而不是一个线程,需要给任务很多次,那么线程池执行器是更好的选择。Eg要求图像加载从多个url像滑翔。

线程

Android支持标准的Java线程。您可以使用标准线程和包“java.util”中的工具。并发”将操作放到后台。唯一的限制是您不能直接从后台进程更新UI。

如果你需要从后台任务更新UI,你需要使用一些Android特定的类。你可以使用类“android.os”。或者AsyncTask类

类“Handler”可以更新UI。句柄为接收消息和可运行对象提供方法。要使用处理程序,必须继承它的子类并重写handleMessage()来处理消息。要处理Runable,可以使用post()方法;您的活动中只需要一个处理程序实例。

线程可以通过sendMessage(Message msg)或sendEmptyMessage方法发布消息。

AsyncTask

如果你有一个Activity需要下载内容或执行可以在后台完成的操作,AsyncTask允许你维护一个响应式用户界面,并将这些操作的进度发布给用户。

要了解更多信息,你可以看看这些链接。

http://mobisys.in/blog/2012/01/android-threads-handlers-and-asynctask-tutorial/

http://www.slideshare.net/HoangNgoBuu/android-thread-handler-and-asynctask