AsyncTask 和 Thread 之间的真正区别
Posted
技术标签:
【中文标题】AsyncTask 和 Thread 之间的真正区别【英文标题】:Real difference between AsyncTask and Thread 【发布时间】:2012-07-30 07:30:16 【问题描述】:我一直在阅读 android 文档 (AsyncTask, Thread) 和 vogella tutorial 关于这件事,但我还有疑问。
例如,我想从 Android 应用程序向服务器发送消息。我希望这个过程能够响应。我应该使用什么?
我已经看到他们创建一个新的Thread
用于不阻止 UI 的示例,但是这样我们就没有进程的进度,您还必须在 Thread
中处理响应,因为 run()
方法不返回任何内容。
AsyncTask
似乎比Thread
更好,但我不知道使用AsyncTask
而不是Thread
的后果是什么。
【问题讨论】:
【参考方案1】:请阅读此博客
http://crazyaboutandroid.blogspot.in/2011/12/difference-between-android.html
详细信息如下:
Android Service、Thread、IntentService和AsyncTask的区别
什么时候使用?
服务
Task with no UI, but shouldn't be too long. Use threads within service for long tasks.
线程
- Long task in general.
- For tasks in parallel use Multiple threads (traditional mechanisms)
异步任务
- Small task having to communicate with main thread.
- For tasks in parallel use multiple instances OR Executor
【讨论】:
您从哪里得知AsyncTask
用于小任务而Thread
用于长任务?为什么一个人不应该将AsyncTask
用于长时间的任务?
@BugsHappen 请检查以下链接,您将了解为什么建议将 AsyncTask 用于小任务。
你指的是哪个链接?
@BugsHappen 这是一个非常好的问题,技术上异步任务和线程没有区别,唯一的区别是异步任务可以通过其回调方法更新 UI。因此,就应该在其中执行的操作的长度而言,异步任务和线程之间应该没有区别。
死链接,博客表见here【参考方案2】:
这里所有其他答案都不完整,AsyncTask和Thread有很大区别,即
线程可以从任何线程、main(UI) 或后台触发;但 AsyncTask 必须从主线程触发。
同样在 Android 的较低 API(不确定,可能 API 级别
更多信息请阅读Difference between Android Service, Thread, IntentService and AsyncTask
一般
线程
一般来说是长任务。
对于并行任务使用多线程(传统机制)
异步任务
必须与主线程通信的小任务。
对于并行任务使用多个实例或执行器
【讨论】:
为什么要在AsyncTask中只运行短任务?由于线程和异步任务的操作方式相似?【参考方案3】:一般使用 2 这个特性是等价的,但是 AsyncTask 在与 GUI 的集成方面更简单
【讨论】:
但是 android 文档说“AsyncTasks 应该理想地用于短操作(最多几秒钟)。” 是的,因为您使用 GUI 并且用户不想等待很长时间 :) 但是 AsynTask 会像一个独立的线程一样运行。他的工作不应该影响到主线程(GUI)。还是我错了? 是的,您需要同步 2 点:onreexecute 和 onpostexecute【参考方案4】: 我更喜欢使用 Async Task,因为它会让您知道何时background process
得到开始和结束,我什么时候可以parse
响应。
Async 有 onPreExecute
和 onPostExecute
这样的方法,可以让我们在调用后台之前和之后执行任务
任务。
【讨论】:
【参考方案5】:AsyncTask 允许正确且轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。
你可以控制它自己的功能
doInBackground(参数...参数), onCancelled(), onPostExecute(Result 结果), onPreExecute(), nProgressUpdate(进度...值), 发布进度(进度...值)
【讨论】:
【参考方案6】:AsyncTask enables proper and easy use of the UI thread.
- 来自Developer。
问题是 - AsyncTask 是一种特殊的线程 - 它是一个 GUI 线程,它在后台工作,还可以让你用 GUI 做一些事情 - 它基本上是为你“预编程”的函数@ 987654323@.
为了使Thread
以这种方式工作,您必须编写大量代码。
【讨论】:
不需要大量代码。使用处理程序非常基础以上是关于AsyncTask 和 Thread 之间的真正区别的主要内容,如果未能解决你的问题,请参考以下文章
Thread.Sleep() 和 await Task.Delay 之间的真正区别是啥? [复制]