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

我得到RejectedExecution例外,在我的代码。我记得读书的地方,有到的AsyncTask可以同时在队列中有任务数的限制,我可能会打那个。在这条取消?

有没有增加此限制的方法吗?是安全的只是忽略此异常?(由具有空catch(RejectedException e){}块?)

我运行在Android 1.6模拟器此代码和API级在我的代码(的minSdkVersion是3)。 [编辑:添加SDK和API级信息]

有帮助吗?

解决方案

  

我记得读书的地方,那里   是任务数的限值   可以的AsyncTask在其在队列   一次,我可能会打那个。是   这条抬起?

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

  

有没有增加此限制的方式?

抓图的源代码,修改它,把它放在自己的包,并使用一个。我没有这与我的 AsyncTaskEx 时,尽管这是基于Android 1.5源上。

  

它是安全的忽略这个   异常?

您的工作不会被排队以供执行。无论是“安全”是你。我不知道对AsyncTask基础设施的任何其他方面的影响。

其他提示

我这样做完全一样的自己事情的应用程序。

在一次从服务器下载缩略图和他们推到一个数据适配器启动20个并行线程听起来并不像一个好主意,我。所有这些线程只会跳遍互相在对方的方式得到的。

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

您可以使用与AsyncTask.executeOnExecutor串行执行,序列化你的任务,但将任务仅限制于当时的并发任务。也许是好的,但越来越缩略图时:

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

在的问题是,未决AsyncTask.THREAD_POOL_EXECUTOR AsyncTasks的数量是128。一旦队列被填满没有新AsyncTasks可排队。

从的AsyncTask源代码:

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

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

“安全”忽略 - 你需要确保任何形式的通知,你是计划在做后执行将在这里完成,当你发现错误 - 否则,你可能会,如果你的其他代码留下点什么挂使得假设有关从该任务的回信。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top