我正在使用asyncTasks,用图片加载列表元素(只需按照android有效加载位图的教程)
在DDMS中,我可以看到最多5个正在运行的AsyncTasks
现在另外我添加了另一个AsyncTask,它使用MediaCodec类执行一些解码。
现在在DDMS中,我仍然看到5个AsyncTasks,我的图像加载aynctask或解码异步任务执行,而不是两个。
当解码正在运行时,如果我滚动列表,元素'图像未更新 反之,当我通过调用它的执行方法启动新的解码asynctask时,解码不会启动,但如果我现在滚动列表视图,则会更新图像。
AsyncTask是否受到限制?
即使在listAdapter中,我也会为每个getView调用启动一个AsyncTask。我期待7个运行asyncTasks(如果列表可见元素是7,比方说),但DDMS只显示5个asynctasks正在运行。
现在有人可以解释一下我能拼出的黑魔法是什么吗?
答案 0 :(得分:20)
您可以同时运行多少AsyncTasks
个?
在大多数Android版本中,答案是 128 。
为什么一般会看到5个AsyncTask
个帖子?
AsyncTask
线程管理相当混乱,特别是因为自第一个Android发布以来它已经发生了很大变化。
在较新的Android版本中,默认情况下会创建5个线程,而ThreadPoolExecutor
将尝试在这5个线程上运行AsyncTask
。如果您创建的AsyncTask
超过5个,它可能会将它们排队或创建新线程(但最多只能创建128个)。
请注意,在早期版本的Android中,这些限制是不同的。我相信,最初只创建了一个线程。
但是你的所有图片最终都会加载......
要回答问题的其他部分,除非您正在加载大量图片(其中很多意味着> 128),所有图片都应该加载,尽管可能会按顺序加载。如果前5个加载而其余不加载,则可能表示您的doInBackground()
函数永远不会完成,或者您正在使用的AsyncTask
出现其他问题。
<强>资源:强>
以下是一些有用的资源,可用于了解有关AsyncTask
线程管理的更多信息:
Android AsyncTask threads limits?
Is there a limit of AsyncTasks to be executed at the same time?