的AsyncTask,RejectedExecutionException和任务限制
-
21-09-2019 - |
题
我从远程服务器获取大量的缩略图和在网格视图中显示它们,使用的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
有无限的队列。
“安全”忽略 - 你需要确保任何形式的通知,你是计划在做后执行将在这里完成,当你发现错误 - 否则,你可能会,如果你的其他代码留下点什么挂使得假设有关从该任务的回信。