AsyncTasks是否有同时执行的限制?

时间:2012-03-07 00:01:16

标签: android android-asynctask limit android-2.3-gingerbread

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

我一直在制作这个在启动时执行10个AsyncTasks的项目。 每个任务包含3个URL,这些URL在那里收集数据,并且在应用程序中尚未执行任何重要操作。

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

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

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

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

有人可以为我详细说明吗?

2 个答案:

答案 0 :(得分:8)

是的,有一个限制。 AsyncTask由核心池大小为5的ThreadPoolExecutor支持,但最大池大小为128(从1.6到4.0.3),所以我认为你应该看到你的所有10个马上跑。你不能改变它。如果你真的想做一些不同的事情(除非你有一个非常具体的原因我不会推荐它),你必须做一些自定义的更大的池大小或者只是手动旋转一堆线程。

<强>更新

以下是文档的说法:

  

如果有超过corePoolSize但运行的maximumPoolSize线程少于,则只有在队列已满时才会创建新线程。

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

答案 1 :(得分:0)

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

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

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