AsyncTask,RejectedExecutionException和Task Limit

时间:2010-03-22 14:22:34

标签: android error-handling android-asynctask

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

我的代码中出现RejectedExecution异常。我记得在某个地方读过AsyncTask一次可以在队列中拥有的任务数量有限,我可能会这样做。这个酒吧被解除了吗?

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

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

5 个答案:

答案 0 :(得分:17)

  我回想起那里的某处   是对任务数量的限制   AsyncTask可以在其队列中有一个   时间,我可能会打那个。是   这个酒吧解除了?

AsyncTask目前似乎支持10个线程,工作队列深度为10.理论上,这只会支持20个项目...如果没有其他任何东西使用AsyncTask

  

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

获取源代码,修改它,将其放入您自己的包中,然后使用它。我使用AsyncTaskEx执行了此操作,但这是基于Android 1.5源代码。

  

忽略这一点是否安全   异常?

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

答案 1 :(得分:7)

我在一个应用程序中完成了同样的事情。

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

来自AsyncTask源代码:

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

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

答案 4 :(得分:1)

忽略“安全” - 当您发现错误时,您需要确保您计划在后执行中执行的任何类型的通知都会在此处完成 - 否则如果您的其他代码可能会遗漏某些内容做出关于从这项任务中回听的假设。