是AysncTask与ExecutorService?

时间:2018-07-18 06:29:43

标签: android multithreading service

我必须从服务器下载文件,这些文件的大小可能约为100 MB。以前,我使用下载管理器下载这些文件,但最终遇到大量错误,并且不得不编写复杂的代码来跟踪下载状态。因此,我决定自己编写下载代码,并在AsyncTask中进行下载(但是此异步任务不会在service中运行)。 AsyncTask似乎工作正常,我设法显示一条通知以跟踪下载进度。
开发者网站对此表示

  

如果您需要长时间保持线程运行,强烈建议您使用java.util.concurrent包提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。

有人可以告诉我,在后台长时间运行下载的AsyncTask到底有什么问题,为什么开发者网站建议使用Executor服务?还可以在没有service的情况下运行AsyncTask吗(目前我正在做什么)?

3 个答案:

答案 0 :(得分:1)

主要区别是

  • AsyncTask是具有单线程执行器的(默认情况下),它使您可以执行后台操作并将结果发布到UI线程上。它充当Thread和Handler的帮助类,使我们能够操纵线程和/或处理程序。
  • 另一方面,
  • ExecutorService interface ,它扩展了Executor界面。它定义了合同及其最底层的实现,以决定执行方式并相应地管理线程。

    Android还以AbstractExecutorService的形式提供了一些抽象的默认实现。最常用的具体实现是ThreadPoolExecutor

      

    线程池解决了两个不同的问题:它们通常提供   在执行大量异步操作时提高了性能   任务,因为减少了每个任务的调用开销,并且它们提供了   限制和管理资源(包括线程)的方法,   在执行任务集合时消耗。每个ThreadPoolExecutor   还维护一些基本统计信息,例如完成的数量   任务。

答案 1 :(得分:0)

我认为AsyncTask可以正常工作(如果您确实没有关闭它(破坏活动))。您甚至可以在应用程序真正关闭时使用IntentService独立下载数据。另外,您还需要为独立服务的清单添加权限(或仅使用new-> service ...创建它)。 另外,异步任务在其自己的线程中工作。

答案 2 :(得分:0)

AsyncTask的潜在问题在于,默认情况下它使用单个线程执行器。如果您不提供自己的执行器,则长期运行的任务将阻止任何其他AsyncTask使用默认执行器。

无论您使用的是AsyncTask还是Executor,都需要将其托管在一个Android组件中,该组件将继续存在直到任务完成为止。如果您希望任务在应用程序不在前台时能够可靠地运行,则它需要在Service中,最好是在前台服务中。否则,在终止该过程之前,它最多只能运行约半小时(在最新版本的Android上)。