我正在使用AsyncTask
s 来获取数据以响应用户按下按钮。这很好用,并且在获取数据时保持界面响应,但是当我检查 Eclipse 调试器中发生的事情时,我发现每次AsyncTask
创建一个新的时(这很常见,因为它们只能使用一次),正在创建一个新线程,但从未终止。
结果是大量AsyncTask
线程就坐在那里。我不确定这在实践中是否存在问题,但我真的很想摆脱那些额外的线程。
我怎样才能杀死这些线程?
我正在使用AsyncTask
s 来获取数据以响应用户按下按钮。这很好用,并且在获取数据时保持界面响应,但是当我检查 Eclipse 调试器中发生的事情时,我发现每次AsyncTask
创建一个新的时(这很常见,因为它们只能使用一次),正在创建一个新线程,但从未终止。
结果是大量AsyncTask
线程就坐在那里。我不确定这在实践中是否存在问题,但我真的很想摆脱那些额外的线程。
我怎样才能杀死这些线程?
AsyncTask
管理一个线程池,使用ThreadPoolExecutor
. 它将有 5 到 128 个线程。如果线程数超过 5 个,这些多余的线程最多会停留 10 秒,然后才会被移除。(注意:这些数字是针对目前可见的开源代码,并因 Android 版本而异)。
请不要管这些AsyncTask
线程。
除了 CommonsWare 的回应:
目前我使用的是 Android 2.2,我的应用程序在任何时候都使用不超过一个 AsyncTask,但我每 x 分钟创建一个新任务。起初,新的 AsyncTask 线程开始出现(新 AsyncTask 的新线程),但在 5 个线程之后(如 CommonsWare 所述),它们只会在调试窗口中保持可见,并在需要新的 AsyncTask 线程时重新使用。他们只是呆在那里,直到调试器断开连接。
这里有同样的症状。在我的情况下,线程在我杀死 Activity 后仍然存在,我希望应用程序完全关闭。通过使用单线程执行程序部分解决了问题:
myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());
这使得线程在完成工作后消失了。
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);
Runnable
使用 execute()方法发布您的任务。
void execute (Runnable command)
在未来的某个时间执行给定的任务。任务可能在新线程或现有池线程中执行
关于您的第二个查询:
我怎样才能杀死这些线程?
完成所有工作后ThreadPoolExecutor
,请按照以下帖子中的引用正确关闭它: