2012-01-09 61 views
4

我在我的应用程序中的AsyncTask的实例,它是用于在用户登录到应用程序,问题是,当作为的AsyncTask执行了“onPostExecution”功能,该线程的AsyncTask仍然“运行”(如Eclipse调试器中所示)。 onPostExecution只修改UI组件和(在成功登录的情况下),开始一个新的活动。Android不终止的AsyncTask线后onPostExecution

我怎样才能终止线程?

+0

这是多还是少[这篇文章]的副本(http://stackoverflow.com/questions/8407408/asynctask-keeps-waiting/8407518#8407518)。 – kabuko 2012-01-09 18:51:03

回答

1

是否有你需要的线程终止什么特别的原因?通常情况下,您可以让系统处理这个问题,但根据我的经验,一旦您使用AsyncTask,它的线程就会等待执行另一个AsyncTask

+0

我有不同的活动使用新的AsyncTask对象,所以创建了这些线程的堆栈,但大多数不会使用多次。 – 2012-01-09 18:14:04

+0

不用担心,系统运行正常。他们现有的线程被保存在内存中,以防止创建另一个线程。 (根据我的经验,每个应用程序最多3个)请放心,任务正在完成,但仍留在以防万一再次需要。 – 2012-01-09 21:41:50

5

为了执行AsyncTask,Android使用线程池因此所有Thread对象都会自动回收。所以没有必要手动杀死线程

对于这项工作有在AsyncTask两个静态字段:当你打电话asyncTask.execute(Params... params)使用的ExecutorSERIAL_EXECUTORTHREAD_POOL_EXECUTOR,实例。

如果你需要更多的控制,你可以使用另一种方法asyncTask.executeOnExecutor(Executor exec, Params... params)指定另一个Executor实例 - 例如,你可以使用Executors.newSingleThreadExecutor(),给你一个ExecutorService实例。通过这种方式,您可以“关闭”ExecutorService,最终销毁所有线程,并调用方法executor.shutdown()

+0

这些字段SERIAL_EXECUTOR和THREAD_POOL_EXECUTOR以及方法executeOnExecutor()仅在API 11 + .is上面提供,有没有针对小于11的api版本的解决方法? – Ads 2012-06-07 08:08:24

0

只是检查正在运行的线程应用程序中的

如果你的项目是在Java应用程序:

int active = Thread.activeCount(); 
System.out.println("currently active threads: "+active); 
Thread all[] = new Thread[active]; 
Thread.enumerate(all); 
for (int i = 0; i < active; i++) { 
    System.out.println(i + ": " + all[i]); 
} 

如果[R采用了android项目申请:

String run=""; 
int active =Thread.activeCount(); 
System.out.println("currently active threads: " + active); 
Thread all[] = new Thread[active]; 
Thread.enumerate(all); 

for (int i = 0; i < active; i++) { 
    run+=all[i]+"\n"; 
} 
// declare the EditText in your main thread 
edittext.setText(run);