一个单进程应用程序可以运行多少个AsyncTasks?

11

我正在使用AsyncTasks来加载带有图像的列表元素(只是按照Android的教程有效地加载位图)。

在DDMS中,我可以看到最多有5个AsyncTasks正在运行。

现在我添加了另一个AsyncTask,它使用MediaCodec类执行一些解码操作。

现在在DDMS中,我仍然看到5个AsyncTasks,并且我的图像加载异步任务或解码异步任务之一被执行,而不是两者同时执行。

当解码正在运行时,如果我滚动列表,则元素的图像不会更新。相反,当我通过调用其execute方法启动新的解码异步任务时,解码不会开始,但是如果我现在滚动列表视图,则图像将更新。

那么AsyncTask是否受到限制?

即使在listAdapter中,我也会在每个getView调用中启动一个AsyncTask。 如果列表可见元素为7,则预期会有7个正在运行的异步任务(例如),但是DDMS仅显示5个异步任务正在运行。

现在有人可以解释一下我不知道的黑魔法吗?


1
在这里回答了 https://dev59.com/b2kw5IYBdhLWcg3wx9eC#9654445 - nnesterov
1个回答

22

你最多可以同时运行多少个AsyncTask

在大多数Android版本中,答案是128

为什么通常会看到恰好5个AsyncTask线程?

AsyncTask线程管理相当混乱,尤其是自首个Android版本以来它已经发生了很多变化。

在较新的Android版本中,默认创建5个线程,并且ThreadPoolExecutor将尝试在这5个线程上运行AsyncTasks。如果您创建了超过5个AsyncTask,它可能会排队或创建新线程(但最多只能到128个)。

请注意,在较早版本的Android中,这些限制是不同的。我相信,最初只创建了一个线程。

但是所有图像最终都应该加载...

为回答您问题的另一部分,除非您正在加载大量图像(其中大量意味着> 128),否则所有图像都应该加载,虽然可能是顺序加载的。如果前5个加载而其余未加载,则可能表明您的doInBackground()函数从未完成或您正在使用的AsyncTask存在其他问题。

资源:

以下是了解AsyncTask线程管理的一些有用资源:

AsyncTask线程从未死亡

Android AsyncTask线程限制?

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


所有我的图像都在加载。还有一个疑问,取消的AsyncTasks,它会计入AsyncTasks的数量吗?即,在核心线程计数或最大线程计数中计算? - nmxprime
1
一旦 AsyncTask 结束,它不会计入 128 个线程的限制。但是,即使您剩下少于 5 个 AsyncTask,您仍然可能会看到 5 个线程。(请参见上面的第一个链接。) - Computerish
优秀的答案。 - Sreekanth Karumanaghat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接