我在我的应用程序中使用了许多AsyncTask类。我总是开始使用它们:Android - 如何检查ThreadPoolExecutor是否已达到队列限制?
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
asyncTask.execute();
}
最近我得到了RejectedExecutionException异常。我了解了这一点,并理解了为什么会发生这种情况(超出了线程池执行程序可以在其队列中执行的最大任务数)。
但我没有阅读任何关于检查线程池执行程序是否有可用插槽的方法,以便我可以避免这种情况。从我测试的asyncTask.execute();方法没有这个限制。
所以我在寻找这样的事情:
if(executorCanHandlerAnotherQueue()){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
asyncTask.execute();
}
}
else{
asyncTask.execute();
}
如何向后兼容实现这个任何想法多达API 9?
谢谢你的回应,但这不是问题。我已经知道这一点。我正在寻找的是一种类似于'boolean canExecutorAddAnotherQueue()'的方法,我可以使用它来确定是否可以将我的asyncTask添加到Executor线程池中 – Anonymous
请参阅我的更新答案,您可以使用try catch或写入自定义处理程序为您的情况 – Ken
你写的方法似乎更像它。尝试抓住似乎是一个可怜的办法但是我不使用自定义的ThreadPoolExecutor。 AsyncTask使用它自己的。所以MAX_QUEUE_SIZE_YOU_DEFINED是AsyncTask定义的那个。根据我的理解,这取决于设备所具有的内核数量。在我的设备上测试它我发现getQueueSize()是128时抛出异常,但我不知道如何使用API获取该数字。 – Anonymous