在UI中,为了执行一些后台工作,我使用了一个独立的Thread
。但是根据其他人的建议,现在我正在使用AsyncTask
。
Thread
和AsyncTask
之间的主要区别是什么?
在哪种情况下,应该使用Thread
或AsyncTask
?
在UI中,为了执行一些后台工作,我使用了一个独立的Thread
。但是根据其他人的建议,现在我正在使用AsyncTask
。
Thread
和AsyncTask
之间的主要区别是什么?
在哪种情况下,应该使用Thread
或AsyncTask
?
对于长时间运行或 CPU 密集型任务,基本上有两种方法可以实现:Java 线程和 Android 的本地 AsyncTask。
没有哪种方法比另一种更好,但知道何时使用每种调用是利用系统性能为您带来好处的关键。
使用 AsyncTask 来:
使用 Java 线程来:
还有许多互联网上的良好资源可供使用:
http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html
如果您将结果返回到用户界面,则需要与主线程同步
没有默认选项用于取消线程
没有默认线程池
Android中没有默认选项用于处理配置更改
线程
异步任务
线程
线程是并发执行的基本单位,它有自己的调用栈。 在应用程序中实现线程有两种方法。
一种是提供一个扩展Thread类并覆盖其run()方法的新类。另一种是在创建时提供一个带有Runnable对象的新Thread实例。可以通过调用线程的“start”方法来执行线程。您可以通过调用线程的“setPriority(int)”方法来设置线程的“优先级”。
如果您对UI部分没有影响,则可以使用线程。例如,您正在调用某些Web服务或下载某些数据,并且下载后正在将其显示到屏幕上。然后,您需要使用Handler和Thread,这将使您的应用程序处理来自线程的所有响应变得复杂。
Handler允许您发送和处理与线程的MessageQueue相关联的消息和Runnable对象。每个线程都有自己的消息队列。 (就像待办事项列表),线程将获取每个消息并处理它,直到消息队列为空。因此,当处理程序进行通信时,它只会将消息传递给调用线程,并等待处理。
如果使用Java线程,则需要在自己的代码中处理以下要求:
如果要将结果发布回用户界面,则需要与主线程同步没有默认的取消线程没有默认的线程池没有Android处理配置更改的默认值
异步任务
AsyncTask使UI线程的使用正确而容易。此类允许在不必操作线程和/或处理程序的情况下执行后台操作并在UI线程上发布结果。异步任务由在后台线程上运行且其结果在UI线程上发布的计算定义。
AsyncTask将经历以下4个阶段:
onPreExecute()
在任务执行之前在UI线程上调用
doInBackground(Params..)
在onPreExecute()执行完成后立即在后台线程上调用。
onProgressUpdate(Progress..)
在调用publishProgress(Progress...)之后在UI线程上调用。
onPostExecute(Result)
在后台计算结束后在UI线程上调用。
为什么应该使用AsyncTask?
易于在UI线程中使用。(因此,在调用线程是UI线程时,请使用它。)
无需操作处理程序。
有关更多信息,请访问这里
线程:
Thread
应该被用于将长时间运行的操作与主线程分离,以提高性能。但是它不能优雅地取消操作,并且不能处理 Android 的配置更改。你不能从 Thread
更新 UI。
AsyncTask
可以用于处理执行时间小于 5ms 的工作项。使用 AsyncTask
,你可以更新 UI,不像Java中的Thread
。但是许多长时间运行的任务会影响性能。
你还有其他几个选择。
HandlerThread/Handler 和 ThreadPoolExecutor
查看下面的帖子以了解更多详细信息:
如果您有需要同时运行以利用CPU核心并缩短时间延迟的长任务,您应该绝对使用多线程或线程:
后台线程
初始化线程或(初始化可以作为内部线程
),不像AsyncTask
。Volatile
和Atomicity
的内容。UIhandler
通知UiThread
。