Asynctask vs android中的线程
在UI中,为了执行一些后台工作,我使用了一个单独的Thread
。 但正如其他人所build议的,我现在使用AsyncTask
。
Thread
和AsyncTask
之间的主要区别是什么?
在哪种情况下,我应该使用Thread
还是AsyncTask
?
对于长时间运行或CPU密集型任务,基本上有两种方法可以实现:Java线程和Android的本地AsyncTask。
两者都不一定比另一个更好,但是知道何时使用每个呼叫对于充分利用系统的性能是非常重要的。
使用AsyncTask进行以下操作:
- 简单的networking操作,不需要下载大量的数据
- 磁盘绑定的任务可能需要超过几个毫秒
使用Java线程进行:
- 涉及中等到大量数据(上传或下载)的networking操作
- 高CPU任务需要在后台运行
- 任何你想要控制相对于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与线程