我必须从服务器下载文件,这些文件的大小可能约为100 MB。以前,我使用下载管理器下载这些文件,但最终遇到大量错误,并且不得不编写复杂的代码来跟踪下载状态。因此,我决定自己编写下载代码,并在AsyncTask
中进行下载(但是此异步任务不会在service
中运行)。 AsyncTask
似乎工作正常,我设法显示一条通知以跟踪下载进度。
开发者网站对此表示
如果您需要长时间保持线程运行,强烈建议您使用java.util.concurrent包提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。
有人可以告诉我,在后台长时间运行下载的AsyncTask到底有什么问题,为什么开发者网站建议使用Executor服务?还可以在没有service
的情况下运行AsyncTask吗(目前我正在做什么)?
答案 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上)。