【问题标题】:Performance comparison: AsyncTasks vs Threads性能比较:AsyncTasks vs Threads
【发布时间】:2013-04-01 14:01:21
【问题描述】:

在我的应用程序中,我必须调用一个完成一些繁重工作的方法(我能感觉到设备滞后)。为了避免这种情况,我创建了一个AsyncTask,它工作得非常好。

我使用Thread 实现了同样的事情,在这里,它也没有出现任何问题并且工作正常。

现在我的问题是哪一个性能更好 - AsyncTaskThread

我知道AsyncTask 使用线程池来执行后台任务,但在我的情况下它只会被调用一次。所以我认为这不会造成任何问题。

有人可以解释一下吗。我应该使用哪个以获得更好的性能?

注意:两者都在我的活动中被调用,例如来自 UI 线程。

【问题讨论】:

  • 两者之间不太可能有显着的性能差异。 AsyncTasks 允许在 UI 线程上进行有效的多线程,而普通线程不允许对 UI 进行更改。这是两者之间的主要区别,除了AsyncTask 使用线程池(正如你所说,这不会影响你)
  • 这个问题也有讨论过:stackoverflow.com/questions/9296539/…
  • 感谢 HXCaine 的 cmets。正如上面链接的答案所说,“每次创建新线程时,您都在创建一个新线程”。真的。但就我而言,我只调用一次。所以它不能满足我的问题。

标签: android android-asynctask


【解决方案1】:

有人可以解释一下吗。我应该使用哪个更好 性能?

我认为,如果您想象一下启动一次原生 Thread 和 AsyncTask 的情况,我认为性能不会有所不同。

如果您不想通过UI 向潜在的USER 通知有关某些任务的进度的相关信息,通常会使用本机线程。在这里,本机线程失败,因为它们没有与UI 线程同步,并且您无法使用它们执行 UI 操作。

另一方面,AsyncTask 将后台工作与 UI 工作相结合,并提供与 UI 同步的方法,并允许通过调用其生命周期的适当方法随时执行 UI 更新。

一般情况下,如果某项任务持续时间超过 5 秒,您应该通知USER

“正在后台工作,请等待完成”

当然,这可以通过两种不同的方式实现,但这在很大程度上取决于您的任务的性质 - 如果您需要显示任务的进度(已经下载了多少 MB,复制文件的数量并显示每个文件的名称进行中的对话框等)或者您不这样做(例如,仅使用开始和结束消息在“静默”中创建一些大数据结构)。

所以在我的回答结束时:

我应该使用哪个以获得更好的性能?

我认为您无法得到完全正确的答案,因为每个开发人员都有不同的经验,不同的编码风格。我如何提到,他们的表现没有什么不同。我认为它是相同的(如果您将读取 50 MB 文件,则读取本机线程和 AsyncTask 都不会更快)。这又取决于任务的性质和您的个人选择。

更新:

对于可以持续更长时间的任务,您还可以尝试考虑java.util.concurrent 包提供的API 工具(ThreadPoolExecutor、FutureTask 等)

【讨论】:

  • 很好的解释。在这种情况下,我可以说,如果我不想在完成繁重的工作后更新 UI(假设只有一个任务),我应该使用 Thread,因为它易于使用。单个任务的性能方面,两者表现相同。如果我错了,请纠正我。
【解决方案2】:

异步任务也是线程。但是他们有一些实用方法,可以很容易地处理小型后台任务并返回 UI 进行更改。性能将取决于您的具体用例。就哪一个总是更好做出绝对的陈述将是简单化且毫无意义的。

请注意,Async 任务优于线程的主要优点是 Async 任务提供了辅助方法,例如 onPreExecute()doInBackground()onProgressUpdate()onPostExecute(),这使得在执行简短的后台任务的同时还可以进行交互变得非常容易使用 UI(例如更新进度条)。这些类型的方法在通用线程中不可用。基本上,异步任务是内置 UI 交互组件的线程。是的,您也可以使用变通方法尝试从常规线程更新 UI,但异步任务是专门为此目的而构建的,您不必处理 Context如果你遵循它的抽象,就会出现泄漏等等。

创建异步任务是为了让开发人员的生活更轻松。

总结一下:

  • 异步任务也是线程
  • 异步任务可让您在执行简短的后台任务时轻松与 UI 交互
  • 两者本质上都不是更有效的。这取决于你想做什么。
  • 良好的经验法则:如果您在完成后台任务后需要返回/更新 UI,请使用异步任务。如果您不这样做,请使用常规线程。

【讨论】:

  • 谢谢。因此,在单个任务的情况下,两者都是相同的。
【解决方案3】:

Thread 最常见的用途是短期任务,因为它们需要大量电力,而且往往会耗尽电池电量并使手机发热。
AsyncTasks 的常见用法是冗长的任务,因为同样的电池消耗。

但是线程要强大得多,因为 AsyncTasks 内部使用线程本身,但您不必配置那么多。

【讨论】:

  • 没有。异步任务旨在用于短时间间隔。 Quoting the docs - “理想情况下,AsyncTasks 应该用于短操作(最多几秒钟。)”。电池消耗也与 AsyncTasks / Threads 的使用无关。
猜你喜欢
  • 2021-01-04
  • 2015-01-28
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多