Asynctask vs android中的线程

在UI中,为了执行一些后台工作,我使用了一个单独的Thread 。 但正如其他人所build议的,我现在使用AsyncTask

ThreadAsyncTask之间的主要区别是什么?

在哪种情况下,我应该使用Thread还是AsyncTask

对于长时间运行或CPU密集型任务,基本上有两种方法可以实现:Java线程和Android的本地AsyncTask。

两者都不一定比另一个更好,但是知道何时使用每个呼叫对于充分利用系统的性能是非常重要的。

使用AsyncTask进行以下操作:

  1. 简单的networking操作,不需要下载大量的数据
  2. 磁盘绑定的任务可能需要超过几个毫秒

使用Java线程进行:

  1. 涉及中等到大量数据(上传或下载)的networking操作
  2. 高CPU任务需要在后台运行
  3. 任何你想要控制相对于GUI线程的CPU使用率的任务

互联网上有很多好的资源可以帮助你:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html http://www.mergeconflict.net/2012/05/java-threads-vs-android-asynctask-which.html

如果使用Java线程,则必须在自己的代码中处理以下要求:

如果将结果回传到用户界面,则与主线程同步

没有默认取消线程

没有默认的线程池

在Android中处理configuration更改时没有默认值

线

  • 一般来说任务很长
  • 通过thread.start()方法调用
  • 任何线程触发
  • 运行在自己的线程上
  • 手动线程pipe理/代码可能变得难以阅读

的AsyncTask

  • 小任务必须与主线程进行通信
  • 通过excute()方法调用
  • 主线程触发
  • 工作线程上运行
  • 必须从主线程执行和创build

线

线程是一个并发的执行单元。 它有自己的调用堆栈。 有两种方法可以在应用程序中实现线程。

一个是提供一个扩展Thread并覆盖run()方法的新类。 另一个是在创build过程中提供一个带有Runnable对象的新的Thread实例。 一个线程可以通过调用其“开始”方法来执行。 您可以通过调用其“setPriority(int)”方法来设置线程的“优先级”。

如果您在UI部分中没有任何影响,则可以使用线程。 例如,您正在调用一些Web服务或下载一些数据,下载后,您将显示在屏幕上。 然后,您需要使用一个带有线程的处理程序,这将使您的应用程序变得复杂,以处理来自线程的所有响应。

Handler允许您发送和处理与线程的MessageQueue关联的Message和Runnable对象。 每个线程都有每个消息队列。 (就像一个待办事项列表),线程将采取每个消息并进行处理,直到消息队列为空。 所以,当处理程序通信时,它只是给调用者线程一个消息,它将等待处理。

如果使用Java线程,则需要在自己的代码中处理以下要求:

如果将结果回发给用户界面,则与主线程同步无取消线程的默认值无默认线程池在Android中处理configuration更改时没有默认值

的AsyncTask

AsyncTask支持正确和简单地使用UI线程。 这个类允许在UI线程上执行后台操作和发布结果,而无需操作线程和/或处理程序。 asynchronous任务由在后台线程上运行的计算来定义,并且其结果在UI线程上发布。

AsyncTask将经历以下4个阶段:

onPreExecute()

执行任务之前在UI线程上调用

doInbackground(PARAMS ..)

onPreExecute()完成执行后立即在后台线程上调用。

onProgressUpdate(进步..)

调用publishProgress(Progress …)后,在UI线程上调用。

onPostExecute(结果)

后台计算完成后在UI线程上调用。

为什么你应该使用AsyncTask?

易于使用的UI线程。 (所以,当调用者线程是一个UI线程时使用它)。

不需要操作Handlers。

欲了解更多信息,请访问

线:

应该使用线程从主线程中分离长时间运行的操作,以提高性能。 但是它不能被优雅取消,也不能处理Android的configuration变更。 您无法从Thread更新UI。

AsyncTask可以用来处理短于5ms的工作项目。 借助AsyncTask ,您可以更新UI,而不像Java Thread 。 但是很多长时间运行的任务会扼杀性能。

你有两个更多的替代品。

HandlerThread / Handler和ThreadPoolExecutor

请参阅下面的post了解更多详情:

处理器VS AsyncTask与线程