从AsyncTask.THREAD_POOL_EXECUTOR中删除并终止所有任务

时间:2013-10-09 02:39:13

标签: android android-asynctask

我想在AsyncTask.THREAD_POOL_EXECUTOR上运行一些AsyncTask。 我使用以下代码。

Tasks[i].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
                                                              taskParams);

在将一定数量的线程发送到执行程序后,它不再接受新的AsyncTasks。 (我没有看到任何错误,但doInBackGroundMethod由于某种原因没有启动。)

我怀疑这是因为它的游泳池已经满了。 有没有办法重置执行程序? 我想完全终止所有任务,以便它再次开始接受新任务并立即处理它们。

我尝试使用 cancel 方法终止任务,但它没有帮助。

2 个答案:

答案 0 :(得分:2)

你的任务完成了吗?你在处理适当的例外吗?你创建了多少个任务?

请注意AsyncTask.THREAD_POOL_EXECUTOR(至少在API 17;此文档页面包含大量有用的详细信息),设置为

public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);

CORE_POOL_SIZE为5且MAXIMUM_POOL_SIZE为128。

带有

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

这意味着队列的最大容量为10个项目。

THREAD_POOL_EXECUTOR至少保留5个线程。添加任务后,它们将添加到队列中。当队列填满时,将生成新的线程,最多128个(还有其他限制)。

当发生这种情况时(128个线程,最大值,正在运行且队列已满),任何新任务都将被拒绝,并使用默认处理程序处理(因为它没有明确设置,是AbortPolicy) ,抛出RejectedExecutionException

确保您不仅仅是捕捉并且不处理此类例外。

解决这个问题的一种方法是创建自己的ExecutorService(即使它只是具有不同参数的ThreadPoolExecutor实例)并配置最适合您情况的参数。像队列这样的参数(你可以控制它可以容纳的项目数量,或者它是否无限制等)或者如何处理被拒绝的任务。

答案 1 :(得分:1)

我可以看到取消AsyncTasks仍在运行的两个原因:

  • 要么cancel设置为mayInterruptIfRunning
  • ,请不要致电true
  • 您可以调用AsyncTask.cancel(true),但执行的代码会错过InterruptedException:确保您的代码(以及可能的后续调用库)不会混淆/沉默{{1通过InterruptedException上的try / catch甚至是InterruptedException上的。{/ li>