android中的Asynctask vs Thread

时间:2013-08-28 05:44:35

标签: android multithreading android-asynctask

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

ThreadAsyncTask之间的主要区别是什么?

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

5 个答案:

答案 0 :(得分:135)

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

两者都不一定比另一方好,但知道何时使用每次通话对于利用系统的性能对您有利。

使用AsyncTask:

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

    1. 涉及中等到大量数据(上传或下载)的网络操作
    2. 需要在后台运行的高CPU任务
    3. 您想要控制相对于GUI线程的CPU使用率的任何任务
    4. 互联网上有很多好的资源可以帮助你:

      http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

答案 1 :(得分:39)

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

  

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

     

取消线程没有默认值

     

没有默认的线程池

     

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

答案 2 :(得分:26)

主题

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

<强>的AsyncTask

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

答案 3 :(得分:11)

  

<强>发

     

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

     

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

     

如果您在UI部分中没有任何影响,则可以使用线程。对于   例如,您正在调用某些Web服务或下载某些数据,以及   下载后,您将其显示在屏幕上。然后你需要   使用带螺纹的处理程序,这将使您的应用程序   很难处理Threads的所有响应。

     

Handler允许您发送和处理Message和Runnable对象   与线程的MessageQueue相关联。每个线程都有每条消息   队列。 (就像待办事项列表一样),线程将采用每条消息和   处理它直到消息队列为空。所以,当处理程序   通信,它只是给调用者线程一个消息,它会   等待处理。

     

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

     

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

     

<强>的AsyncTask

     

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

     

AsyncTask将经历以下4个阶段:

     

<强> onPreExecute()

     

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

     

<强> doInbackground(PARAMS ..)

     

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

     

<强> onProgressUpdate(进步..)

     

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

     

<强> onPostExecute(结果)

     

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

     

为什么要使用AsyncTask?

     

易于用于UI线程。 (所以,当调用者线程是a时使用它   UI线程)。

     

无需操纵处理程序。

有关详细信息,请访问Here

答案 4 :(得分:2)

<强>发

Thread应该用于将长时间运行的操作与主线程分开,以便提高性能。但它不能优雅地取消,它无法处理Android的配置更改。您无法从Thread更新用户界面。

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

你可以选择其他两种方式。

HandlerThread / HandlerThreadPoolExecutor

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

Handler vs AsyncTask vs Thread