2013-07-04 57 views
52

我有问题困扰着我。AsyncTask和Thread/Runnable之间的区别

想象一下,我想在另一个线程中做点什么,就像在SDK文档中推荐的获取GPS/Location东西一样,必须使用后台线程。

因此,这里的问题:什么是通过AsyncTask

  • 创建Thread thread1 = new Thread(new Runnable() ...和实施run()

    1. 创建在后台Thread之间的区别?

  • 回答

    40

    AsyncTask是做一个新的线程一些工作,并从中得到了所谓的完成当线程(通常是UI线程)上使用的结果一个方便的类。它只是一个使用几个runnables的包装器,但它处理创建线程和处理线程间消息传递的所有复杂性。

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

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

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

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

    另外,如果我从this blog引用:

    ,如果你需要简单的编码使用的AsyncTask,如果你需要速度使用传统的Java线程。

    +0

    做不过请注意,根据版本的Android的代码运行时,只能有一个的AsyncTask在任何时间运行。 –

    +1

    @AlexGittemeier即使在这些版本中,您也可以通过使用executeOnExecutor并告诉它使用一个池而不是仅仅调用execute来告诉它运行更多。 –

    +1

    AsyncTask:进程完成后的响应,线程:进程完成。 –

    1

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

    +5

    你可以,如果你使用'executeOnExecutor()'(你可以有条件地做,所以你不会失去兼容性)。 – matiash

    0

    AsyncTask类的一个显而易见的缺点是,在Android 3.0之后,asynctasks按照开始时间的顺序执行。即除了通过调用'executeOnExecutor(Executors.newCachedThreadPool())'来执行任务之外,任务会逐个执行。这个方法会创建你自己的线程池。

    1

    主要差异:

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

    2. 所建议的关于Thread performance开发人员指南,

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

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

    纯java线程对Android来说并不是很有用,不像HandlerThread,它已经由Android框架提供。

    方便的类用于启动具有活套的新线程。然后可以使用循环来创建处理程序类。请注意,start()仍然必须被调用。

    请参阅以下职位了解详细内容:

    Handler vs AsyncTask vs Thread