如何在android中启动多个下载

时间:2013-06-11 14:59:35

标签: android service download task

我正在开发一个Android torrent应用程序,我需要能够同时下载多个种子。我见过其他应用程序。我可以在ttorrent安卓应用程序上同时下载超过10个种子。我目前正在使用具有异步任务的服务,但我不能同时运行超过5个(Running multiple AsyncTasks at the same time -- not possible?)。关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:0)

所有AsyncTasks都由共享(静态)ThreadPoolExecutor和LinkedBlockingQueue在内部控制。当你在AsyncTask上调用execute时,ThreadPoolExecutor会在将来某个时候准备就绪时执行它。

'我什么时候准备好?' ThreadPoolExecutor的行为由两个参数控制,即核心池大小和最大池大小。如果当前活动的核心池大小线程少于并且新作业进入,则执行程序将创建一个新线程并立即执行它。如果至少有核心池大小线程在运行,它将尝试对作业进行排队并等待有空闲线程可用(即直到另一个作业完成)。如果无法对作业进行排队(队列可以具有最大容量),则它将为要运行的作业创建新线程(最大池大小的线程)。非核心空闲线程最终可以根据保持活动超时参数。

在Android 1.6之前,核心池大小为1,最大池大小为10.自Android 1.6以来,核心孔径为5,最大池大小为128.两种情况下队列的大小均为10 。保持活动超时是在2.3之前的10秒,然后是1秒。

考虑到所有这一切,现在很清楚为什么AsyncTask只会执行5/6的任务。第6个任务正在排队,直到完成其他任务之一。这是为什么不应该使用AsyncTasks进行长时间运行的一个很好的理由 - 它会阻止其他AsyncTasks运行。

为了完整性,如果你用超过6个任务(例如30个)重复练习,你将看到超过6个将进入doInBackground,因为队列将变满并且推送执行器以创建更多的工作线程。如果您继续执行长时间运行的任务,您应该会看到20/30变为活动状态,其中10个仍在队列中。

答案 1 :(得分:-1)

为什么不使用Android下载管理器。我不知道它如何管理下载,但它似乎同时下载了大量文件。

Android Download Manager