7

这应该有一个简单的答案,但我找不到任何答案。因为我还是一个机器人假人,所以我来这里问你们。

我一直在制作这个在启动时执行 10 个 AsyncTasks 的项目。每个任务包含 3 个 URL,它们在那里收集数据并且在应用程序中没有做任何重要的事情(目前)。

我还有 10 个文本视图,用于跟踪 AsyncTasks 的进度。

当任务开始时,适当的文本视图被置于“开始”当任务正在进行时,它将其适当的文本视图设置为“下载”当任务完成时,它将其适当的文本视图设置为“完成”

这就是我观察到的并对 AsyncTask 提出疑问。当我启动应用程序时,我注意到有 5 个文本视图被切换到“正在下载”标记,所以我看到 5 个 AsyncTasks 正在按他们应该的方式工作。完成后,它会启动一个新的 AsyncTask。然而,它们从未超过 5 的限制。

是什么导致了同时运行 5 个 AsynchTasks 的限制?我是否在某些我找不到的文件中造成了这种情况?这是android 2.3.3的限制吗?也许是我用来模拟应用程序的设备的限制?

任何人都可以为我详细说明吗?

4

2 回答 2

9

是的,有一个限制。AsyncTask由 a 支持,ThreadPoolExecutor核心池大小为 5,但最大池大小为 128(从 1.6 - 4.0.3),所以我真的认为你应该看到你的所有 10 个同时运行。但是你不能改变它。如果您真的想做一些不同的事情(除非您有非常具体的原因,否则我不会推荐它),您必须使用更大的池大小进行自定义操作,或者手动启动一堆线程。

更新:

这是文档所说的:

如果运行的线程数多于 corePoolSize 但少于 maximumPoolSize,则仅当队列已满时才会创建新线程。

所以这就是为什么。您的队列未满,因此它只是将其保持在核心池大小。

于 2012-03-07T00:07:36.797 回答
0

ThreadPoolExecutor 有一个 corePoolSize、一个 maxPoolSize 和一个 QueueCapacity。如果使用了 corePoolSize 中的所有线程,则任何其他任务都将放入核心池中每个线程的队列中。在这些队列已满后,将初始化一个新线程,只要它在 maxPoolSize 的限制内。

这里的问题是每个线程的队列(除非以编程方式更改)是UNBOUNDED。这意味着您使用了核心池大小中的所有线程,并且任何其他任务都排队等待轮到它们使用其中一个核心线程。他们永远没有机会达到最大池大小。

您必须配置自己的 Executor 并更改队列容量。祝你好运!

于 2016-03-17T09:10:07.187 回答