Android не прерывает поток ASyncTask после onPostExecution - PullRequest
4 голосов
/ 09 января 2012

В моем приложении есть экземпляр ASyncTask, который используется для входа пользователя в приложение, проблема заключается в том, что когда ASyncTask выполняет функцию «onPostExecution», поток ASyncTask остается «работающим» (как показано в Eclipse Debugger). OnPostExecution изменяет только компоненты пользовательского интерфейса и (в случае успешного входа в систему) запускает новое действие.

Как мне прекратить тему?

Ответы [ 3 ]

5 голосов
/ 09 января 2012

Для выполнения AsyncTask Android использует пул потоков , поэтому все объекты Thread автоматически перерабатываются.Поэтому нет необходимости вручную удалять поток .

. Для этого задания в AsyncTask есть два статических поля: SERIAL_EXECUTOR и THREAD_POOL_EXECUTOR, экземпляры Executor, которые используются при вызове asyncTask.execute(Params... params).

Если вам нужно больше контроля, вы можете использовать альтернативный метод asyncTask.executeOnExecutor(Executor exec, Params... params), указав другой Executor экземпляр - например, вы можете использовать Executors.newSingleThreadExecutor(), который дает вам экземпляр ExecutorService.Таким образом, вы можете «отключить» ExecutorService, окончательно уничтожив все потоки, вызвав метод executor.shutdown().

1 голос
/ 09 января 2012

Есть ли какая-то особая причина, по которой вам нужно прекратить поток?Обычно вы позволяете системе справиться с этим, но по моему опыту, когда вы используете AsyncTask, его поток остается в ожидании выполнения другого AsyncTask.

0 голосов
/ 10 августа 2014

просто проверьте запущенные потоки в вашем приложении

если ваш проект в 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]);
}

если вы используете приложение проекта 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...