机器人中的异步与线程

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

ThreadAsyncTask的主要区别是什么?

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

110478 次浏览

对于长时间运行或 CPU 密集型任务,基本上有两种方法: Java 线程和 Android 的本机 AsyncTask。

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

使用 AsyncTask:

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

使用 Java 线程:

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

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

Http://www.vogella.com/articles/androidbackgroundprocessing/article.html

线头

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

一种方法是提供一个新类来扩展 Thread 并重写它的 另一个是为新的 Thread 实例提供一个 可运行的对象。线程可以由 调用其“开始”方法。您可以通过以下方法设置线程的“优先级” 调用它的“ setAdvanty(int)”方法。

如果对 UI 部分没有影响,则可以使用线程 例如,您正在调用某个 Web 服务或下载某些数据,并且 下载后,你会将它显示在你的屏幕上。然后你需要 使用具有线程的处理程序,这将使您的应用程序 处理来自 Threads 的所有响应非常复杂。

Handler 允许发送和处理 Message 和 Runnable 对象 每个线程都有一条消息 (类似于待办事项列表) ,并且线程将接收每条消息和 处理它,直到消息队列为空 通信,它只是给调用者线程一个消息,它会 等待处理。

如果使用 Java 线程,则需要处理以下内容 要求:

如果将结果回发到 用户界面取消线程没有默认值没有默认值 在 Android 中处理配置更改没有默认设置

AsyncTask

AsyncTask 允许正确和方便地使用 UI 线程 上执行后台操作并发布结果 UI 线程,而不必操作线程和/或处理程序 异步任务由运行在 后台线程,其结果在 UI 线程上发布。

AsyncTask 将经历以下4个阶段:

OnPreExecute ()

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

背景(Params. .)

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

OnProgressUpdate (Progress. .)

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

OnPostExecute (结果)

在背景计算结束后在 UI 线程上调用。

为什么要使用 AsyncTask?

易于用于 UI 线程(因此,当调用方线程是 用户界面线程)。

没必要操纵联络人。

如需进一步资料,请浏览 给你

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

如果将结果回发到 用户界面

取消线程没有默认设置

没有默认的线程池

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

线程

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

AsyncTask

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

线索:

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

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

除了这两者之外,你几乎没有其他选择。

HandlerThread /管理员和 < a href = “ https://developer.android.com/reference/java/util/concur/ThreadPoolExecutor.html”rel = “ noReferrer”> ThreadPoolExecutor

详情请参阅以下文章:

处理程序 vs AsyncTask vs 线程

如果您有更长的任务,应该并发工作,以利用 CPU 核心和缩短时间延迟,您绝对应该使用 多线程线头:

  • 您可以初始化线程形式的 Background Thread或(初始化可以作为 Inner Thread)不同于 AsyncTask
  • 您不需要继承父类和重写方法(更清洁更精确)。
  • 你可以自己管理 并发性与多线程,只是阅读有关 VolatileAtomicity
  • 对于在 UI 上发布,可以使用同步线程并使用 UIhandler通知 UiThread