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 响应。 AsynconPreExecuteonPostExecute 这样的方法,可以让我们在调用后台之前和之后执行任务 任务。

【讨论】:

【参考方案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 之间的真正区别的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask 对比与 Thread+Handler

服务、异步任务和线程之间的区别?

Thread.Sleep() 和 await Task.Delay 之间的真正区别是啥? [复制]

android中asynctask和thread的区别

AsyncTask 和 Thread/Runnable 的区别

android中asynctask和thread的区别