Estou usando AsyncTask
s para buscar dados em resposta ao usuário pressionando um botão. Isso funciona bem e mantém a interface responsiva enquanto busca os dados, mas quando eu verifiquei o que estava acontecendo no depurador Eclipse, descobri que toda vez que um novo AsyncTask
era criado (o que é muito frequente, porque eles só podem ser usados uma vez ), um novo encadeamento estava sendo criado, mas nunca encerrado.
O resultado é um grande número de AsyncTask
tópicos parados ali. Não tenho certeza se isso é um problema na prática ou não, mas eu realmente gostaria de me livrar desses tópicos extras.
Como posso matar esses tópicos?
android
multithreading
android-asynctask
Informático
fonte
fonte
doInBackground
método é concluído, mas o encadeamento continua a aparecer na janela de depuração. Por exemplo:Thread [<23> AsyncTask #4](Running)
Respostas:
AsyncTask
gerencia um pool de threads, criado comThreadPoolExecutor
. Terá de 5 a 128 threads. Se houver mais de 5 threads, esses threads extras permanecerão por no máximo 10 segundos antes de serem removidos. (nota: esses números são para o código-fonte aberto visível no momento e variam de acordo com a versão do Android).Deixe os
AsyncTask
tópicos em paz, por favor.fonte
AsyncTask
para algo que demoraria tanto é uma má ideia em geral. Mas não, meu comentário sobre os tópicos extras indo embora é quando eles não são usados. Portanto, quando uma de suas 6 tarefas terminar, seu encadeamento permanecerá no pool por 10 segundos, após os quais o encadeamento será encerrado.AsyncTask
hoje não é um grande plano. Ter mais de 20 que podem ser executados por mais de 10 segundos é o tipo de coisa que deve falhar em uma revisão de código. Se você criar 20 tarefas em rápida sucessão, apenas algumas serão executadas de uma vez e o restante será enfileirado para execução posterior. Quantos serão executados de uma vez é baseado no número de núcleos da CPU. AFAIK, o algoritmo atual é 2N + 1 threads paralelos, onde N é o número de núcleos.Além da resposta do CommonsWare:
Atualmente estou usando o Android 2.2 e meu aplicativo não usa mais do que uma AsyncTask por vez, mas estou criando uma nova a cada x minutos. No início, novos Threads AsyncTask começam a aparecer (um novo Thread para uma nova AsyncTask), mas após 5 threads (como mencionado por CommonsWare), eles apenas permanecem visíveis na janela de depuração e são reutilizados quando novos threads AsyncTask são necessários. Eles apenas ficam lá até que o depurador seja desconectado.
fonte
Mesmo sintoma aqui. No meu caso, os tópicos ficaram pendurados depois que eu encerrei a Activity, e eu esperava que o App fechasse completamente. Problema parcialmente resolvido usando um único executor encadeado:
Isso fez com que o tópico desaparecesse após a conclusão de seu trabalho.
fonte
Use ThreadPoolExecutor .
Publique sua
Runnable
tarefa usando o método execute () .Em relação à sua segunda consulta:
Assim que tiver concluído todo o seu trabalho
ThreadPoolExecutor
, desligue-o adequadamente conforme citado na postagem abaixo:Como desligar corretamente o java ExecutorService
fonte