6

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

我也使用 a 和在这里实现了同样的事情Thread,它不会产生任何问题并且工作正常。

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

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

有人可以对此有所了解。我应该使用哪个以获得更好的性能?

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

4

3 回答 3

6

有人可以对此有所了解。我应该使用哪个以获得更好的性能?

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

如果您不想USER通过UI. 在这里,本机线程失败,因为它们与UI线程不同步,您无法使用它们执行 UI 操作。

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

通常,如果某些任务持续时间超过 5 秒,您应该USER告知

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

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

所以在我的回答结束时:

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

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

更新:

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

于 2013-04-01T14:58:05.223 回答
2

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

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

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

总结一下:

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

最常见的用途Thread是短期任务,因为它们需要大量电力并且往往会耗尽电池并加热手机。由于相同的电池消耗
,通常使用的是冗长的任务。但是线程要强大得多,因为 AsyncTasks 内部使用线程本身,但您不必配置那么多。AsyncTasks

于 2013-04-01T14:17:23.493 回答