61

I have question which puzzles me.

Imagine I wanna do something in another thread, like fetching GPS/Location stuff, which as recommended in the SDK documents, must use a background thread.

So here is the question: What's the difference between

  1. Creating a Thread in background via AsyncTask AND

  2. Creating Thread thread1 = new Thread(new Runnable() ... and implementing run()?

4

6 回答 6

48

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 接口应该由其实例打算由线程执行的任何类实现。

另外,如果我引用此博客

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

于 2013-07-04T16:28:35.153 回答
2

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

于 2014-06-04T03:07:41.413 回答
2

主要区别:

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

  2. 正如开发人员指南关于线程性能的建议,

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

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

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

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

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

处理程序 vs AsyncTask vs 线程

于 2017-08-30T05:21:10.860 回答
1

不推荐使用 api 级别 30 的 AsyncTask。使用 thread/runnable 很方便

于 2020-08-21T20:09:24.070 回答
0

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

于 2015-05-28T09:38:35.543 回答
0

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

于 2018-12-06T10:12:46.557 回答