2014-10-08 2 views
0

Когда я нажимаю кнопку 1 (выполнить) в UI, я запускаю AsyncTask. Задача выполнена успешно.asynctask WAIT mode

Run first time task

жму другой button2 (отмена), чтобы остановить AsyncTask от основного потока

asynctask.cancel(true); 

но AsyncTask нить DonT самостоятельно убить! (См второго скриншота) Переключатель AsyncTask в режиме WAIT

task in wait mode

то я могу нажать кнопку Button1 (выполнить) снова и запустить НОВОЕ задание и нажмите button2 (отменить)

enter image description here

И у меня есть по очереди:

Зачем ставить задачу без самообслуживания после использования cancel (true)? И что означает режим WAIT?

ответ

0

AsyncTask под капотом использует ThreadPoolExecutor. Эти потоки, возможно, не исчезнут, потому что это будет пустой тратой, чтобы продолжать создавать и срывать эти потоки слишком часто. Через некоторое время, если вы создадите больше AsyncTasks, вы обнаружите, что перестанут создавать новые потоки, и они будут повторно использовать старые.

Update для решения некоторых деталей:

Можно было бы подумать, что если есть свободные потоки в бассейне, он не будет создавать новые, но это не совсем верно. Идея состоит в том, что существует определенное количество потоков, которые могут быть полезны для продолжения обработки асинхронных задач. Это называется размером основного пула. В случае AsyncTask Android, они, кажется, установить его до 5. Если вы посмотрите на документацию для ThreadPoolExecutor он говорит:

When a new task is submitted in method execute(Runnable), and fewer than corePoolSize threads are running, a new thread is created to handle the request, even if other worker threads are idle. 

Там также максимальная подходяще называется максимальный размер пула.