为什么android中有AsyncTask?

时间:2014-03-26 12:57:37

标签: android android-asynctask

为什么在android中使用异步任务执行任务?,任务可以直接在ui线程中执行。 ui线程有任何限制吗?

3 个答案:

答案 0 :(得分:4)

  

ui线程有任何限制吗?

主应用程序(“UI”)线程驱动您的用户界面。如果你让那个线程做自己的工作,那么当你的工作正在进行时,你的用户界面就会被冻结。在您允许主应用程序线程恢复正常工作之前,您尝试进行的更新将不会发生。此外,当您将主应用程序线程绑定时,来自用户的触摸事件将不会响应。

问题是,除非你被告知,否则只要Android代码以你的一个回调方法的形式调用你的代码,它就会在这个主应用程序线程上执行。

我的一般建议是,要在任何单独的回调方法(例如onCreate()getView()onListItemClick())中完成的工作需要在1毫秒内完成。许多此类回调都是作为UI处理的一部分调用的。如果你花费太多时间,你可能会“丢帧”(即,阻止UI以所需的每秒60帧的速率进行更新),从而导致“jank”。

AsyncTask是帮助将工作从主应用程序线程移开的一种方法,同时仍然使用该工作的结果更新UI相当方便。通常,您无法从后台线程更新UI,但有一些例外(例如ProgressBar)。

答案 1 :(得分:0)

出于安全目的,如果UI Thread中有任何长进程(超过5秒),Android OS将终止该应用程序。

因此,要解决此类异常以及从网络下载数据等长时间运行操作,Android会引入一个名为AsyncTask的新类。

  

AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

答案 2 :(得分:0)

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

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

如果您在UI部分中没有任何影响,则可以使用线程。例如,您正在调用某些Web服务或下载某些数据,并在下载后将其显示在屏幕上。然后你需要使用带有线程的处理程序,这将使你的应用程序变得复杂,以处理来自线程的所有响应。

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

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

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

的AsyncTask

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

AsyncTask将经历以下4个阶段:

onPreExecute()

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

doInbackground(Params..)

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

onProgressUpdate(Progress..)

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

onPostExecute(Result)

在后台计算完成后在UI线程上调用。 你为什么要使用AsyncTask?

  • 易于用于UI线程。 (所以,当调用者线程是a时使用它 UI线程)。
  • 无需操纵处理程序。

使用 AsyncTask

  • 简单的网络操作,不需要下载很多 数据

  • 可能需要几毫秒的磁盘绑定任务

使用Java线程:

  • 涉及中等到大量数据的网络操作 (上传或下载)

  • 需要在后台运行的高CPU任务

  • 要控制相对于GUI的CPU使用率的任何任务 螺纹