AsyncTask 和 Thread/Runnable 的区别

Posted

技术标签:

【中文标题】AsyncTask 和 Thread/Runnable 的区别【英文标题】:Difference between AsyncTask and Thread/Runnable 【发布时间】:2013-07-02 17:26:20 【问题描述】:

我有一个令我困惑的问题。

假设我想在另一个线程中执行某些操作,例如获取 GPS/位置信息,正如 SDK 文档中所建议的那样,必须使用后台线程。

所以问题来了:

    通过AsyncTask 在后台创建Thread AND

    创建Thread thread1 = new Thread(new Runnable() ...并实现run()

【问题讨论】:

【参考方案1】:

AsyncTask 是一个便利类,用于在新线程上做一些工作,并在完成后使用调用它的线程(通常是 UI 线程)上的结果。它只是一个包装器,它使用了几个可运行对象,但处理了创建线程和处理线程之间的消息传递的所有复杂性。

AsyncTask 允许正确且轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。

AsyncTask 被设计成一个围绕 Thread 和 Handler 的辅助类,并不构成一个通用的线程框架。 AsyncTasks 最好用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如Executor、ThreadPoolExecutor 和 FutureTask。

异步任务由在后台线程上运行的计算定义,其结果在 UI 线程上发布。异步任务由 3 种通用类型定义,称为 Params、Progress 和 Result,以及 4 个步骤,称为 onPreExecute、doInBackground、onProgressUpdate 和 onPostExecute。

Runnable 接口是 Java 线程的核心。 Runnable 接口应该由其实例打算由线程执行的任何类实现。

如果我引用this blog:

如果您需要简单的编码,请使用 AsyncTask,如果您需要 SPEED,请使用传统的 java Thread。

【讨论】:

请注意,根据您的代码运行的 android 版本,任何时候都只能运行一个 AsyncTask。 @AlexGittemeier 即使在那些版本上,您也可以通过使用 executeOnExecutor 并告诉它使用池来告诉它运行更多,而不仅仅是调用 execute。 AsyncTask:进程完成后的响应,线程:进程完成。 好的。所以基本上两者都是相同的,但方法不同? @AlexGittemeier 在版本 11 之前,它默认允许多个异步任务。所以基本上检查版本,如果低于 11 就调用执行,如果高于 11 调用 executeOnExecutor()。那么唯一不起作用的是pre-2.0,在这一点上我不会担心。【参考方案2】:

主要区别:

    AsyncTask 是一个异步任务,由在后台线程上运行的计算定义,其结果在 UI 线程上发布。除非您在 UI Thread 上使用 Handler 并发布消息或通过实施适当的同步直接更改对象的属性,否则无法使用普通线程完成。

    根据开发者指南关于Thread performance 的建议,

    有几个重要的性能方面需要牢记。首先,默认情况下,应用程序会将其创建的所有 AsyncTask 对象推送到单个线程中。因此,它们以串行方式执行,并且与主线程一样,特别长的工作包会阻塞队列。因此,我们建议您只使用 AsyncTask 处理持续时间小于 5 毫秒的工作项。

    但是普通的Thread 可以用于长时间运行的任务。

与 Android 框架提供的 HandlerThread 不同,普通 java 线程对 Android 没有多大用处。

用于启动具有弯针的新线程的便捷类。然后可以使用 looper 来创建处理程序类。请注意,仍然必须调用 start()。

请参阅以下帖子以了解更多详细信息:

Handler vs AsyncTask vs Thread

【讨论】:

【参考方案3】:

还要考虑到从 Android v4.04 开始,您一次不能拥有多个 AsyncTasks,除非您失去与较低版本的兼容性。意识到!

【讨论】:

你可以,如果你使用executeOnExecutor()(你可以有条件地这样做,所以你不会失去兼容性)。【参考方案4】:

API 级别 30 已弃用 AsyncTask。使用 thread/runnable 很方便

【讨论】:

【参考方案5】:

AsyncTask 类的一个明显缺点是在 Android 3.0 之后,asynctasks 是按照开始时间的顺序执行的。也就是说,任务是一个一个地执行,除非你通过调用'executeOnExecutor(Executors.newCachedThreadPool())'来执行任务。此方法将创建您自己的线程池。

【讨论】:

【参考方案6】:

最好使用支持库中的新 Job Scheduler。

【讨论】:

尝试提供有关您的答案的详细信息。如果可能,添加一些代码。how to answer

以上是关于AsyncTask 和 Thread/Runnable 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Android中的AsyncTask和接口回调使用详解

Android之——AsyncTask和Handler对照

AsyncTask 和 SOAP 网络服务

带有 ProgressDialog 和进度条的 AsyncTask

AsyncTask的原理和缺点

AsyncTask 和 Thread 区别