AsyncTask和Thread之间的真正区别

19

我一直在阅读Android文档(AsyncTask, Thread)以及vogella教程,但我仍然有疑虑。

例如,我想从Android应用程序向服务器发送消息。同时我希望这个过程是响应的。我应该使用什么?

我看到一些例子中他们为UI不被阻塞创建了一个新的Thread,但这样我们就无法获得进程的进展,而且你必须在Thread内处理响应,因为run()方法不返回任何内容。

AsyncTask似乎比Thread更好的选项,但我不知道使用AsyncTask代替Thread的后果是什么。

6个回答

33
请阅读这篇博客:

http://crazyaboutandroid.blogspot.in/2011/12/difference-between-android.html

以下是详细内容: Android Service、Thread、IntentService 和 AsyncTask 的区别 何时使用? Service:
   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)

AsyncTask

- Small task having to communicate with main thread.

- For tasks in parallel use multiple instances OR Executor 

1
你从哪里得到的信息说 AsyncTask 适用于小任务,而 Thread 适用于长任务?为什么一个人不应该将 AsyncTask 用于长任务? - Bugs Happen
@BugsHappen 请查看以下链接,您将了解为什么建议使用AsyncTask处理小任务。 - Kanwarpreet Singh
你指的是哪个链接? - Bugs Happen
@BugsHappen 这是一个非常好的问题,从技术上讲,异步任务和线程之间没有区别,唯一的区别在于异步任务可以通过其回调方法更新UI。因此,在它们执行的操作长度方面,异步任务和线程之间应该没有区别。 - Sreekanth Karumanaghat
1
链接失效,请查看此处博客表格的存档链接:https://web.archive.org/web/20180102150725/http://www.onsandroid.com/2011/12/difference-between-android.html - dwb

21

这里的所有其他答案都不完整,AsyncTask和Thread之间存在很大的区别,即

Thread可以从任何线程触发,包括主(UI)线程或后台线程; 但是AsyncTask必须从主线程触发。

此外,在Android低级API(不确定,可能是API级别<11)中,只能执行一次AsyncTask实例。

有关更多信息,请阅读Android Service、Thread、IntentService和AsyncTask之间的区别

一般来说

Thread

  • 一般用于长时间任务。

  • 对于并行任务使用多线程(传统机制)

AsyncTask

  • 用于需要与主线程通信的小任务

  • 对于并行任务使用多个实例或Executor


为什么只有短时间的任务应该在AsyncTask中运行?因为线程和异步任务的操作方式是相似的吗? - Sreekanth Karumanaghat

4

一般来说,使用这两个特性是等价的,但是AsyncTask在与GUI集成方面更加简单。


然而,Android文档表示:“AsyncTasks理想情况下应该用于短时间操作(最多几秒钟)。” - Fran b
是的,因为你正在使用GUI,用户不想等待太长时间 :) - Alex Klimashevsky
但是AsynTask将像独立的线程一样运行。他的工作不应该影响主线程(GUI)。或者我错了吗? - Fran b
是的,您有两个要同步的点:onPreExecute和onPostExecute。 - Alex Klimashevsky

4

AsyncTask可以正确且轻松地使用UI线程。通过这个类,你可以在后台执行操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

你可以控制它自己的函数

doInBackground(Params... params), onCancelled(), onPostExecute(Result result), onPreExecute(), nProgressUpdate(Progress... values), publishProgress(Progress... values)


4
  • 我更喜欢使用异步任务(Async Task),因为它可以通知您后台进程何时开始和结束以及何时可以解析响应结果。
  • 异步任务(Async)具有onPreExecuteonPostExecute等方法,这些方法允许我们在调用后台任务之前和之后执行任务。

3

AsyncTask可以正确且轻松地使用UI线程。- 来自开发者

事实上,AsyncTask是一种特殊的线程 - 它是GUI线程,可以在后台工作,并让您对GUI进行操作 - 基本上它已经为您“预编程”了一些函数:onPreExecute(),doInBackground(),onPostExecute()

为了使Thread以这种方式工作,您必须编写大量代码。


很多代码是不必要的。使用处理程序非常基础。 - Rahul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接