我正在开发一个 android torrent 应用程序,我需要能够同时下载多个 torrent。我见过其他应用程序这样做。我可以在 ttorrent android 应用程序上同时下载 10 多个种子。我目前正在使用具有异步任务的服务,但我不能同时运行超过 5 个(同时运行多个 AsyncTasks - 不可能?)。关于如何做到这一点的任何想法?
2 回答
所有 AsyncTask 都由共享(静态)ThreadPoolExecutor 和 LinkedBlockingQueue 在内部控制。当您在 AsyncTask 上调用 execute 时,ThreadPoolExecutor 将在未来某个时间准备好时执行它。
'我什么时候准备好?ThreadPoolExecutor 的行为由两个参数控制,核心池大小和最大池大小。如果当前活动的线程少于核心池大小并且有新作业进入,则执行程序将创建一个新线程并立即执行它。如果至少有核心池大小的线程在运行,它将尝试将作业排队并等待直到有空闲线程可用(即直到另一个作业完成)。如果无法将作业排队(队列可以有最大容量),它将创建一个新线程(最多最大池大小线程)供作业运行。非核心空闲线程最终可以根据一个保持活动超时参数。
在 Android 1.6 之前,核心池大小为 1,最大池大小为 10。从 Android 1.6 开始,核心孔大小为 5,最大池大小为 128。队列大小在这两种情况下都是 10。keep-alive 超时是 2.3 之前的 10 秒,之后是 1 秒。
考虑到所有这些,现在很清楚为什么 AsyncTask 只会执行 5/6 的任务。第 6 个任务正在排队等待其他任务之一完成。这是您不应该将 AsyncTasks 用于长时间运行的操作的一个很好的理由 - 它会阻止其他 AsyncTasks 运行。
为完整起见,如果您用超过 6 个任务(例如 30 个)重复练习,您将看到超过 6 个将进入 doInBackground,因为队列将变满并且执行程序被推送以创建更多工作线程。如果您继续执行长时间运行的任务,您应该会看到 20/30 变为活动状态,其中 10 仍在队列中。
为什么不使用 Android 下载管理器。我不知道它是如何管理下载的,但它似乎同时下载了很多文件。