15

我正在从远程服务器获取大量缩略图,并使用 AsyncTask 在网格视图中显示它们。问题是,我的网格视图一次显示 20 个缩略图,因此创建 20 个 AsyncTask 并启动 20 个执行,每个缩略图一个。

RejectedExecution的代码出现异常。我记得在某处读到 AsyncTask 一次可以在其队列中拥有的任务数量是有限制的,我可能会遇到这个问题。这个栏被取消了吗?

有没有办法增加这个限制?忽略这个异常是否安全?(通过有一个空catch(RejectedException e){}块?)

我在 Android 1.6 模拟器和我的代码中的 API 级别上运行此代码(minSDKVersion 为 3)。[编辑:添加了 SDK 和 API 级别信息]

4

5 回答 5

17

我记得在某处读到 AsyncTask 一次可以在其队列中拥有的任务数量是有限制的,我可能会遇到这个问题。这个栏被取消了吗?

AsyncTask目前似乎支持 10 个线程和 10 个工作队列深度。理论上,这将只支持 20 个项目......如果没有其他使用AsyncTask.

有没有办法增加这个限制?

获取源代码,对其进行修改,将其放入您自己的包中,然后使用那个。我用我的AsyncTaskEx.,虽然它基于 Android 1.5 源代码。

忽略此异常是否安全?

您的工作不会排队等待执行。这是否“安全”取决于您。我不知道对AsyncTask基础设施有任何其他影响。

于 2010-03-22T15:40:10.847 回答
7

我自己在应用程序中做了同样的事情。

一次启动 20 个并行线程以从服务器下载缩略图并将它们推送到数据适配器对我来说听起来不是一个好主意。所有这些线程只会相互绊倒并相互阻碍。

相反,我将只启动一个线程,让它循环收集缩略图,并在它们到达时将它们添加到适配器。

于 2011-05-04T15:03:42.337 回答
2

您可以使用带有 AsyncTask.executeOnExecutor 的串行执行器来序列化您的任务,但这会将任务限制为一次只能执行一个并发任务。获取缩略图时可能会很好:

myAsyncTask.executeOnExecutor(MyAsyncTask.SERIAL_EXECUTOR, [params] );

于 2012-05-14T17:57:47.597 回答
2

问题是挂起的AsyncTask的数量AsyncTask.THREAD_POOL_EXECUTOR是 128。一旦队列被填满,就不能将新的 AsyncTask 加入队列。

从 AsyncTask 源代码:

private static final BlockingQueue<Runnable> sPoolWorkQueue =
        new LinkedBlockingQueue<Runnable>(128);

在我看来,限制完全没有意义,并且AsyncTask.SERIAL_EXECUTOR有无限的队列。

于 2014-06-25T08:52:10.650 回答
1

“安全”可以忽略 - 您需要确保当您发现错误时,您计划在执行后执行的任何类型的通知都将在此处完成 - 否则如果您的其他代码做出假设,您可能会挂起一些关于收到此任务的回复。

于 2011-05-03T21:10:56.980 回答