AsyncTask和Thread / Runnable之间的区别

时间:2013-07-04 16:26:13

标签: android multithreading android-asynctask runnable android-threading

我有疑问让我感到困惑。

想象一下,我想在另一个线程中做一些事情,比如获取GPS /位置内容,这在SDK文档中建议,必须使用后台线程。

所以问题是:

之间有什么区别
  1. 通过Thread AND

  2. 在后台制作AsyncTask
  3. 创建Thread thread1 = new Thread(new Runnable() ...并实施run()

6 个答案:

答案 0 :(得分:45)

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

  

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

     

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

     

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

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

另外,如果我引用this blog

  

如果你需要SIMPLE编码使用AsyncTask,如果你需要SPEED使用传统的java Thread。

答案 1 :(得分:2)

同时考虑从Android v4.04开始的计数,除非您失去与较低版本的兼容性,否则您一次不能拥有多个AsyncTasks。意识到!

答案 2 :(得分:2)

主要差异:

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

  2. 根据开发者指南的建议Thread performance

      

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

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

  3. 普通java线程对于Android不太有用,而不像Android框架提供的HandlerThread

      

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

    请参阅以下帖子了解更多详情:

    Handler vs AsyncTask vs Thread

答案 3 :(得分:0)

AsyncTask类的一个明显缺点是,在根据开始时间的顺序执行Android 3.0 asynctasks之后。除非您通过调用' executeOnExecutor(Executors.newCachedThreadPool())'来执行任务,否则任务将逐个执行。这个方法会创建自己的线程池。

答案 4 :(得分:0)

更好地使用支持库中的新Job Scheduler。

答案 5 :(得分:0)

AsyncTask已在api级别30中弃用。使用线程/可运行很方便

相关问题