AsyncTask和Thread / Runnable之间的区别

我有问题困扰着我。

想象一下,我想在另一个线程中做一些事情,比如获取GPS文档中推荐的GPS / Location东西,必须使用后台线程。

所以这里是一个问题:两者之间有什么区别

  1. 在后台通过AsyncTask

  2. 创buildThread thread1 = new Thread(new Runnable() …和实现run()

AsyncTask是一个方便的类,用于在新线程上执行一些工作,并在完成时使用调用的线程(通常是UI线程)使用结果。 这只是一个使用几个runnables的包装器,但它处理了创build线程和处理线程间消息传递的所有复杂性。

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

AsyncTask被devise成围绕Thread和Handler的助手类,并不构成通用的线程框架。 理想情况下,AsyncTasks应该用于短操作(最多几秒钟)。如果需要保持线程长时间运行,强烈build议您使用java.util.concurrent pacakge提供的各种API,例如执行器,ThreadPoolExecutor和FutureTask。

asynchronous任务由在后台线程上运行的计算来定义,并且其结果在UI线程上发布。 asynchronous任务由3个genericstypes定义,称为Params,Progress和Result,以及4个步骤,分别称为onPreExecute,doInBackground,onProgressUpdate和onPostExecute。

Runnable接口是Java线程的核心。 Runnable接口应该由其实例旨在由线程执行的任何类来实现。

另外如果我从这个博客引用:

如果您需要SIMPLE编码,请使用AsyncTask,如果您需要SPEED,则使用传统的Java线程。

另外请注意,从Android v4.04开始,您不能一次超过一个AsyncTasks,除非您失去了与较低版本的兼容性。 意识到!

主要区别:

  1. AsyncTask是一个asynchronous任务,由在后台线程上运行的计算定义,并且其结果在UI线程上发布。 除非在UI线程上使用Handler并发布消息,否则不能用普通线程完成,或者通过实现适当的同步直接更改对象的属性。

  2. 根据开发人员指南关于线程性能的build议,

    要记住一些重要的性能方面。 首先,默认情况下,应用程序将所有创build的AsyncTask对象推送到一个线程中。 因此,它们以串行方式执行,并且与主线程一样,特别长的工作包可以阻塞队列。 出于这个原因,我们build议您只使用AsyncTask来处理持续时间短于5ms的工作项目。

    但是正常的Thread可以用于长时间运行的任务。

纯Java线程Android不像HandlerThread那么有用,Android框架已经提供了线程。

方便的类开始一个新的线程,有一个活套。 然后可以使用循环来创build处理程序类。 请注意,start()仍然必须被调用。

参考下面的post了解更多细节:

处理器VS AsyncTask与线程

AsyncTask类的一个显而易见的缺点是,在Android 3.0之后,AsyncTasks按照开始时间的顺序执行。 也就是说任务是逐个执行的,除非通过调用“executeOnExecutor(Executors.newCachedThreadPool())”执行任务。 这个方法会创build你自己的线程池。