我可以在单个流程应用程序中运行多少个AsyncTasks

时间:2014-07-01 08:45:08

标签: android android-asynctask executorservice threadpoolexecutor

我正在使用asyncTasks,用图片加载列表元素(只需按照android有效加载位图的教程)

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

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

现在在DDMS中,我仍然看到5个AsyncTasks,我的图像加载aynctask或解码异步任务执行,而不是两个。

当解码正在运行时,如果我滚动列表,元素'图像未更新 反之,当我通过调用它的执行方法启动新的解码asynctask时,解码不会启动,但如果我现在滚动列表视图,则会更新图像。

AsyncTask是否受到限制?

即使在listAdapter中,我也会为每个getView调用启动一个AsyncTask。我期待7个运行asyncTasks(如果列表可见元素是7,比方说),但DDMS只显示5个asynctasks正在运行。

现在有人可以解释一下我能拼出的黑魔法是什么吗?

1 个答案:

答案 0 :(得分:20)

您可以同时运行多少AsyncTasks个?

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

为什么一般会看到5个AsyncTask个帖子?

AsyncTask线程管理相当混乱,特别是因为自第一个Android发布以来它已经发生了很大变化。

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

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

但是你的所有图片最终都会加载......

要回答问题的其他部分,除非您正在加载大量图片(其中很多意味着> 128),所有图片都应该加载,尽管可能会按顺序加载。如果前5个加载而其余不加载,则可能表示您的doInBackground()函数永远不会完成,或者您正在使用的AsyncTask出现其他问题。

<强>资源:

以下是一些有用的资源,可用于了解有关AsyncTask线程管理的更多信息:

AsyncTask threads never die

Android AsyncTask threads limits?

Is there a limit of AsyncTasks to be executed at the same time?