Estou desenvolvendo um aplicativo onde preciso atualizar algumas informações toda vez que o usuário faz login no sistema, também uso banco de dados no telefone. Para todas essas operações (atualizações, recuperação de dados do banco de dados e etc.) eu uso tarefas assíncronas. Até agora, não vi por que não deveria usá-los, mas recentemente percebi que se eu fizer algumas operações, algumas das minhas tarefas assíncronas simplesmente param na pré-execução e não vão para doInBackground. Era muito estranho deixar assim, então desenvolvi outro aplicativo simples apenas para verificar o que estava errado. E por estranho que pareça, obtenho o mesmo comportamento quando a contagem do total de tarefas assíncronas atinge 5, a 6ª para na pré-execução.
O Android tem um limite de asyncTasks em Activity / App? Ou é apenas um bug e deve ser relatado? Alguém teve o mesmo problema e talvez tenha encontrado uma solução alternativa?
Aqui está o código:
Basta criar 5 desses tópicos para trabalhar em segundo plano:
private class LongAsync extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute()
{
Log.d("TestBug","onPreExecute");
isRunning = true;
}
@Override
protected String doInBackground(String... params)
{
Log.d("TestBug","doInBackground");
while (isRunning)
{
}
return null;
}
@Override
protected void onPostExecute(String result)
{
Log.d("TestBug","onPostExecute");
}
}
E então crie este tópico. Ele entrará em preExecute e travará (não irá para doInBackground).
private class TestBug extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute()
{
Log.d("TestBug","onPreExecute");
waiting = new ProgressDialog(TestActivity.this);
waiting.setMessage("Loading data");
waiting.setIndeterminate(true);
waiting.setCancelable(true);
waiting.show();
}
@Override
protected String doInBackground(String... params)
{
Log.d("TestBug","doInBackground");
return null;
}
@Override
protected void onPostExecute(String result)
{
waiting.cancel();
Log.d("TestBug","onPostExecute");
}
}
fonte
core pool size
oumaximum pool size
?@antonyt tem a resposta certa, mas caso você esteja procurando por uma solução simples, pode dar uma olhada no Needle.
Com ele você pode definir um tamanho de pool de thread customizado e, ao contrário
AsyncTask
, funciona em todas as versões do Android da mesma forma. Com ele você pode dizer coisas como:ou coisas como
Pode fazer muito mais. Confira no GitHub .
fonte
Atualizar : desde a API 19, o tamanho do pool de thread principal foi alterado para refletir o número de CPUs no dispositivo, com um mínimo de 2 e máximo de 4 no início, enquanto aumenta para um máximo de CPU * 2 +1 - Referência
Observe também que, embora o executor padrão de AsyncTask seja serial (executa uma tarefa por vez e na ordem em que chegam), com o método
você pode fornecer um Executor para executar suas tarefas. Você pode fornecer ao THREAD_POOL_EXECUTOR o executor interno, mas sem serialização de tarefas, ou pode até mesmo criar seu próprio Executor e fornecê-lo aqui. No entanto, observe cuidadosamente o aviso nos Javadocs.
Mais uma coisa a observar é que tanto a estrutura fornecida Executors THREAD_POOL_EXECUTOR e sua versão serial SERIAL_EXECUTOR (que é padrão para AsyncTask) são estáticos (construções de nível de classe) e, portanto, compartilhados entre todas as instâncias de AsyncTask (s) em seu processo de aplicativo.
fonte