我目前正在处理一个在其主要布局中有ListView
的应用程序,它的项目是包含在目录中的真实文件的包装器。
填充列表后,我执行AsyncTask,它应从Properties
文件中检索一些数据,如果没有检索到这些数据,我会向Runnable
添加ThreadPoolExecutor
以获取该数据从网站上将其保存到Properties
,然后加载Properties
。
如果我决定更改目录,则在应用程序使用新项目填充目录之前会执行List.clear()
。
因此,如果Thread
中当前有工作/待处理ThreadPoolExecutor
,则会继续执行并使我的应用程序崩溃,因为List
内的项目没有再也不存在了。
我读过一些问题,但没有人满意我。如何阻止当前活动的Thread
访问列表并清空ThreadPoolExecutor
的队列?或者,如何以这样的方式设计runnable,如果不再需要它,它不会干扰List
?
更新
在我重新填充List
的方法中,我在执行clear()
之前执行了以下操作:
if(mBlockingQueue.size()>0){
mBlockingQueue.drainTo(new ArrayList<Runnable>()); //I don't want to keep the workers
mThreadPoolExecutor.shutDownNow(); //This will execute .interrupt(); on the working Threads
}
UPDATE2: 这还不够:创建执行程序后,请使用以下
myThreadPoolExecutor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r,ThreadPoolExecutor executor) {
//Do nothing
}
});
答案 0 :(得分:1)
您可以使用此代码暂停任务列表:
BlockingQueue<Runnable> queue = threadPool.getQueue();
List<Runnable> list = new ArrayList<Runnable>();
int tasks = queue.drainTo(list);
然后,您可以按照此文档查找在BlockingQueue上使用remove的方法