【问题标题】:Asynctask vs Thread in androidandroid中的异步任务与线程
【发布时间】:2013-08-31 01:44:18
【问题描述】:

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

ThreadAsyncTask 之间的主要区别是什么?

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

【问题讨论】:

  • @webaldo.at 我引用了这个,这里他们给出了 Asynctask 和 Thread 之间的输入描述和区别。我想知道哪种情况,例如网络连接,我使用的文件读取什么?。跨度>
  • 缩短:线程 -> 无法访问 UI 线程 || Asynctask -> 对 UI 线程的条件访问
  • 对于后台任务 IntentService 是另一个不错的选择。

标签: android multithreading android-asynctask


【解决方案1】:

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

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

将 AsyncTask 用于:

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

将 Java 线程用于:

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

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

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

【讨论】:

  • 请问为什么下载数据量有问题?
  • @Yeung 看来您需要了解异步任务!看,数据量越大,完成相同操作所花费的时间显然越大。因此,由于以下原因,使用 Async Task 执行长时间运行的进程并不是一个好习惯: 1. Async Task 与 Activity 生命周期的联系很差。 2. 它们会造成内存泄漏。
  • 谢谢。我现在明白风险了。
  • @Impasse @Yeung IMO 数据量不是问题,关键是网络操作的问题,操作的时候。当服务器繁忙、无法访问(超时)等情况下,即使下载几个字节也可能需要很长时间。解决方法是使用 AsyncTask 和自己的调度程序。
【解决方案2】:

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

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

取消线程没有默认值

没有默认线程池

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

【讨论】:

  • 这实际上更清楚,因为它解决了为什么不使用简单线程的原因。在我看来,任何需要与 Activity/Service 生命周期相关联的东西都应该使用 AsyncTask 代替,即使您需要手动“优雅地降级”任务中的资源,至少您不会最终导致任务挂起当活动被杀死时。
【解决方案3】:

线程

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

异步任务

  • 小任务必须与主线程通信
  • 通过 excute() 方法调用
  • 主线程触发
  • 工作线程上运行
  • 必须从主线程执行和创建

【讨论】:

  • 我无法理解 Runs on its own threadRuns on worker thread 的对比? Own线程和工作线程有什么区别?
【解决方案4】:

线程

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

一个提供了一个新类,它扩展了 Thread 并覆盖了它的 运行()方法。另一种是提供一个新的 Thread 实例 创建期间的可运行对象。一个线程可以被执行 调用它的“开始”方法。您可以通过以下方式设置线程的“优先级” 调用它的“setPriority(int)”方法。

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

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

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

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

异步任务

AsyncTask 允许正确且轻松地使用 UI 线程。这节课 允许在后台执行操作并发布结果 UI 线程,无需操作线程和/或处理程序。一个 异步任务由运行在 后台线程,其结果发布在 UI 线程上。

AsyncTask 会经历以下 4 个阶段:

onPreExecute()

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

doInbackground(参数..)

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

onProgressUpdate(Progress..)

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

onPostExecute(结果)

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

为什么要使用 AsyncTask?

易于用于 UI 线程。 (所以,当调用者线程是 UI 线程)。

无需操作处理程序。

欲了解更多信息,请访问Here

【讨论】:

    【解决方案5】:

    主题:

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

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

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

    HandlerThread/HandlerThreadPoolExecutor

    更多详情请参考以下帖子:

    Handler vs AsyncTask vs Thread

    【讨论】:

      猜你喜欢
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 2016-10-05
      • 1970-01-01
      • 2016-11-23
      相关资源
      最近更新 更多