AsyncTask线程永远不会死
我使用AsyncTask
来获取数据,以响应用户按下button。 这样做效果良好,在获取数据时保持接口响应,但是当我检查了Eclipsedebugging器中发生了什么时,我发现每次创build一个新的AsyncTask
(通常是因为它们只能被使用一次),一个新的线程正在创build,但从未终止。
结果是大量的AsyncTask
线程就在那里。 我不确定这是否是一个实践中的问题,但我真的想摆脱这些额外的线程。
我怎样才能杀死这些线程?
AsyncTask
pipe理一个使用ThreadPoolExecutor
创build的线程池。 它将有5到128个线程。 如果有超过5个线程,那么这些额外的线程将在被移除之前最多停留10秒。 (注意:这些数字是针对当前可见的开源代码,因Android版本而异)。
请单独离开AsyncTask
线程。
除了CommonsWare的回应:
目前我正在使用Android 2.2,而且我的应用程序在任何时候都只使用一个AsyncTask,但是我正在每x分钟创build一个新的。 首先,新的AsyncTask线程开始出现(一个新的AsyncTask的线程),但在5个线程(如CommonsWare提到的)之后,它们在debugging窗口中保持可见状态,并在需要新的AsyncTask线程时重新使用。 他们只是呆在那里,直到debugging器断开连接。
同样的症状在这里。 在我的情况下,线程在我杀了活动后挂了,我希望应用程序完全closures。 问题部分通过使用单线程执行程序解决:
myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());
这使得线程在完成工作后消失。
使用ThreadPoolExecutor 。
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
完成了所有的工作,就可以在下面的post中引用它:
如何正确closuresjava的ExecutorService
- 在Android应用上接收短信
- 如果我在onResume中调用getMeasuredWidth()或getWidth()进行布局,则它们返回0
- Android:捕获活动的回报
- “adb”不被识别为内部或外部命令,可操作程序或batch file
- 如何捕捉图像并将其与原生Android Camera一起存储
- Android Studio lint报告“无法推断参数types”。
- 设备上的sqlite数据库的位置
- java.lang.NullPointerException:尝试调用空对象引用的虚拟方法'int android.view.View.getImportantForAccessibility()'
- 如何从处理程序中删除所有callback?