在用户界面中,为了执行一些后台工作,我使用了单独的Thread
。但正如其他人所建议的那样,我现在正在使用AsyncTask
。
Thread
和AsyncTask
之间的主要区别是什么?
在哪种情况下,我应该使用Thread
还是AsyncTask
?
答案 0 :(得分:135)
对于长时间运行或CPU密集型任务,基本上有两种方法:Java线程和Android的本机AsyncTask。
两者都不一定比另一方好,但知道何时使用每次通话对于利用系统的性能对您有利。
使用AsyncTask:
使用Java线程:
互联网上有很多好的资源可以帮助你:
http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html
答案 1 :(得分:39)
如果使用Java线程,则必须在自己的代码中处理以下要求:
如果您将结果发回到主页,则与主线程同步 用户界面
取消线程没有默认值
没有默认的线程池
Android中处理配置更改没有默认值
答案 2 :(得分:26)
主题
<强>的AsyncTask 强>
答案 3 :(得分:11)
<强>发强>
线程是并发执行单元。它有自己的调用堆栈。 有两种方法可以在应用程序中实现线程。
一个是提供一个扩展Thread并覆盖它的新类 run()方法。另一个是提供一个新的Thread实例 Runnable对象在创建过程中。线程可以由执行 调用它的“开始”方法。您可以设置线程的“优先级” 调用它的“setPriority(int)”方法。
如果您在UI部分中没有任何影响,则可以使用线程。对于 例如,您正在调用某些Web服务或下载某些数据,以及 下载后,您将其显示在屏幕上。然后你需要 使用带螺纹的处理程序,这将使您的应用程序 很难处理Threads的所有响应。
Handler允许您发送和处理Message和Runnable对象 与线程的MessageQueue相关联。每个线程都有每条消息 队列。 (就像待办事项列表一样),线程将采用每条消息和 处理它直到消息队列为空。所以,当处理程序 通信,它只是给调用者线程一个消息,它会 等待处理。
如果您使用Java线程,则需要处理以下内容 您自己的代码中的要求:
如果您将结果发回到主页,则与主线程同步 用户界面取消线程无默认值无默认线程 pooling在Android中处理配置更改没有默认值
<强>的AsyncTask 强>
AsyncTask可以正确,轻松地使用UI线程。这个班 允许执行后台操作并在上面发布结果 UI线程,无需操纵线程和/或处理程序。一个 异步任务由运行在a上的计算定义 后台线程,其结果发布在UI线程上。
AsyncTask将经历以下4个阶段:
<强> onPreExecute()强>
在执行任务之前在UI线程上调用
<强> doInbackground(PARAMS ..)强>
在onPreExecute()之后立即在后台线程上调用 完成执行。
<强> onProgressUpdate(进步..)强>
在调用publishProgress(Progress ...)之后在UI线程上调用。
<强> onPostExecute(结果)强>
在后台计算完成后在UI线程上调用。
为什么要使用AsyncTask?
易于用于UI线程。 (所以,当调用者线程是a时使用它 UI线程)。
无需操纵处理程序。
有关详细信息,请访问Here
答案 4 :(得分:2)
<强>发强>
Thread
应该用于将长时间运行的操作与主线程分开,以便提高性能。但它不能优雅地取消,它无法处理Android的配置更改。您无法从Thread
更新用户界面。
AsyncTask
可用于处理持续时间小于5毫秒的工作项。使用AsyncTask
,您可以更新UI,而不是java Thread
。但是许多长期运行的任务会扼杀性能。
你可以选择其他两种方式。
HandlerThread / Handler和ThreadPoolExecutor
有关详细信息,请参阅以下帖子: