【问题标题】:How many AsyncTasks i can run in an single process application我可以在单个进程应用程序中运行多少个 AsyncTask
【发布时间】:2014-08-21 18:15:11
【问题描述】:

我正在使用 asyncTasks 来加载带有图像的列表元素(只是按照 android 的高效加载位图教程)

在 DDMS 中,我可以看到多达 5 个 AsyncTask 正在运行

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

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

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

那么 AsyncTask 是有限制的吗??

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

现在谁能解释一下我不会拼写的黑魔法是什么?

【问题讨论】:

标签: android android-asynctask executorservice threadpoolexecutor


【解决方案1】:

你一次可以运行多少个AsyncTasks

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

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

AsyncTask 线程管理相当混乱,尤其是自从第一个 Android 版本以来它发生了很大变化。

在较新的 Android 版本中,默认创建 5 个线程,ThreadPoolExecutor 将尝试在这 5 个线程上运行 AsyncTasks。如果您创建超过 5 个AsyncTasks,它可能会将它们排队或创建新线程(但最多只能有 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?

【讨论】:

  • 我所有的图片都在加载中。还有一个疑问,Canceled AsyncTasks,它会计入 AsyncTasks 的数量吗?即计入核心线程数还是最大线程数?
  • 一旦AsyncTask 结束,我相信它不会计入 128。但是,即使剩余的 AsyncTasks 少于 5 个,您仍然可能会看到 5 个线程。 (参见上面的第一个链接。)
  • 优秀答案。
猜你喜欢
  • 2019-05-26
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多