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