我正在使用AsyncTask
来获取数据以响应用户按下按钮。这很好用并且在获取数据时保持接口响应,但是当我检查Eclipse调试器中发生了什么时,我发现每次创建新AsyncTask
时(这通常是因为它们只能使用一次),正在创建一个新线程但从未终止。
结果是大量的AsyncTask
线程就坐在那里。我不确定这在实践中是否是一个问题,但我真的想摆脱那些额外的线程。
如何杀死这些线程?
答案 0 :(得分:200)
AsyncTask
管理使用ThreadPoolExecutor
创建的线程池。它将有5到128个线程。如果有超过5个线程,那么这些额外的线程将被移除最多10秒钟。 (注意:这些数字适用于目前可见的开源代码,因Android版本而异。)
请单独留出AsyncTask
个帖子。
答案 1 :(得分:24)
除了CommonsWare的回复:
目前我使用的是Android 2.2,我的应用程序在任何时候都只使用一个AsyncTask,但我每隔x分钟创建一个新的。起初新的AsyncTask线程开始出现(新的AsyncTask的新线程),但是在5个线程之后(如CommonsWare所提到的),它们只在调试窗口中保持可见,并在需要新的AsyncTask线程时重新使用。他们只是呆在那里直到调试器断开连接。
答案 2 :(得分:3)
这里的症状相同。在我的情况下,线程在我杀死Activity之后被绞死了,我希望App完全关闭。使用单线程执行程序部分解决了问题:
myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());
这使得线程在完成工作后消失了。
答案 3 :(得分:0)
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
使用execute()方法发布您的Runnable
任务。
void execute (Runnable command)
将来某个时间执行给定的任务。任务可以在新线程或现有池化线程中执行
关于你的第二个问题:
如何杀死这些线程?
完成ThreadPoolExecutor
的所有工作后,请按照以下帖子正确关闭它: