android中的Asynctask vs Thread

Ram*_*Ram 129 multithreading android android-asynctask

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

a Thread和an 之间的主要区别是AsyncTask什么?

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

Moh*_*hit 139

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

两者都不一定比另一个好,但知道何时使用每个呼叫对于利用系统的性能对您有利是至关重要的.

使用AsyncTask:

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

使用Java线程:

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

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

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html http://www.mergeconflict.net/2012/05/java-threads-vs-android-asynctask-which.html

  • 看看这个:http://stackoverflow.com/questions/12797550/android-asynctask-for-long-running-operations?rq=1 (3认同)
  • @Yeung 看来您需要了解异步任务!看,数据量越大,完成相同操作所需的时间显然就越大。因此,由于以下原因,使用异步任务执行长时间运行的流程并不是一个好习惯: 1. 异步任务与 Activity 生命周期的关联性较差。2.它们会造成内存泄漏。 (2认同)

Tar*_*ney 44

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

如果将结果发布到用户界面,则与主线程同步

取消线程没有默认值

没有默认的线程池

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

  • 这实际上更具说明性,因为它解决了为什么不使用简单的线程的原因.从我的头脑中,任何需要绑定到活动/服务生命周期的东西都应该使用AsyncTask,即使你需要手动"优雅地降级"任务内部的资源,至少你不会最终挂起任务当活动被杀死. (3认同)

Uma*_*ari 28

线

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

的AsyncTask

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


Vip*_*hit 11

线

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

一个是提供一个新类,它扩展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(进步..)

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

onPostExecute(结果)

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

你为什么要使用AsyncTask?

易于用于UI线程.(因此,当调用者线程是UI线程时使用它).

无需操纵处理程序.

有关详细信息,请访问此处


Rav*_*abu 6

线:

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

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

你有更多的选择来代替它们。

HandlerThread / HandlerThreadPoolExecutor

有关更多详细信息,请参阅以下帖子:

处理程序 vs AsyncTask vs 线程