153

在 UI 中,为了执行一些后台工作,我使用了单独的Thread. 但正如其他人所建议的那样,我现在正在使用AsyncTask.

Threada和 an之间的主要区别是AsyncTask什么?

在哪种情况下,我应该使用 aThread还是 a AsyncTask

4

5 回答 5

161

对于长时间运行或 CPU 密集型任务,基本上有两种方法可以做到这一点:Java 线程和 Android 的原生 AsyncTask。

两者都不一定比另一个更好,但知道何时使用每个调用对于利用系统性能为您带来好处至关重要。

将 AsyncTask 用于:

  1. 不需要下载大量数据的简单网络操作
  2. 可能需要超过几毫秒的磁盘绑定任务

将 Java 线程用于:

  1. 涉及中到大量数据的网络操作(上传或下载)
  2. 需要在后台运行的高 CPU 任务
  3. 您想要控制相对于 GUI 线程的 CPU 使用率的任何任务

互联网上有很多很好的资源可以帮助你:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

于 2013-08-28T05:51:28.670 回答
48

如果您使用 Java 线程,您必须在自己的代码中处理以下要求:

如果您将结果回发到用户界面,则与主线程同步

取消线程没有默认值

没有默认线程池

在 Android 中处理配置更改没有默认值

于 2013-08-28T06:03:16.350 回答
34

线

  • 一般的 长任务
  • 通过 thread.start() 方法调用
  • 从任何线程触发
  • 自己的线程上运行
  • 手动线程管理/代码可能变得难以阅读

异步任务

  • 必须与主线程通信的小任务
  • 通过 excute() 方法调用
  • 从主线程触发
  • 在工作线程上运行
  • 必须从主线程执行和创建
于 2014-05-19T04:40:41.327 回答
14

线

线程是一个并发的执行单元。它有自己的调用堆栈。有两种方法可以在应用程序中实现线程。

一种是提供一个扩展 Thread 并覆盖其 run() 方法的新类。另一种是在创建过程中提供一个带有 Runnable 对象的新 Thread 实例。一个线程可以通过调用它的“start”方法来执行。您可以通过调用其“setPriority(int)”方法来设置线程的“优先级”。

如果您对 UI 部分没有影响,则可以使用线程。例如,您正在调用一些网络服务或下载一些数据,下载后,您正在将其显示到您的屏幕上。然后您需要使用带有线程的处理程序,这将使您的应用程序复杂地处理来自线程的所有响应。

Handler 允许您发送和处理与线程的 MessageQueue 关联的 Message 和 Runnable 对象。每个线程都有每个消息队列。(就像一个待办事项列表),线程将获取每条消息并处理它,直到消息队列为空。因此,当 Handler 通信时,它只是给调用者线程一个消息,它会等待处理。

如果您使用 Java 线程,那么您需要在自己的代码中处理以下要求:

如果您将结果回发到用户界面,则与主线程同步 取消线程的默认设置 没有默认的线程池 在 Android 中处理配置更改的默认设置

异步任务

AsyncTask 允许正确和轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作和发布结果,而无需操作线程和/或处理程序。异步任务由在后台线程上运行的计算定义,其结果在 UI 线程上发布。

AsyncTask 将经历以下 4 个阶段:

onPreExecute()

在任务执行之前在 UI 线程上调用

doInbackground(参数..)

在 onPreExecute() 完成执行后立即在后台线程上调用。

onProgressUpdate(进度..)

在调用 publishProgress(Progress...) 后在 UI 线程上调用。

onPostExecute(结果)

后台计算完成后在 UI 线程上调用。

为什么要使用 AsyncTask?

易于用于 UI 线程。(因此,当调用者线程是 UI 线程时使用它)。

无需操纵处理程序。

欲了解更多信息,请访问这里

于 2013-08-28T05:54:18.607 回答
6

线:

Thread应该用于将长时间运行的操作与主线程分开,以提高性能。但它不能优雅地取消,也不能处理Android的配置变化。您无法从 更新 UI Thread

AsyncTask可用于处理持续时间小于 5 毫秒的工作项。与AsyncTaskjava 不同,您可以更新 UI Thread。但是许多长时间运行的任务会扼杀性能。

对于这两种方法,您几乎没有其他选择。

HandlerThread / HandlerThreadPoolExecutor

请参阅以下帖子了解更多详情:

处理程序 vs AsyncTask vs 线程

于 2017-05-09T16:46:50.753 回答