Pergunta

Estou buscando muitas miniaturas de um servidor remoto e exibindo-as em uma exibição de grade, usando AsyncTask.O problema é que minha visualização em grade exibe 20 miniaturas por vez, de modo que cria 20 AsyncTasks e inicia 20 execuções, uma por miniatura.

eu recebo RejectedExecution exceção no meu código.Lembro-me de ter lido em algum lugar que há um limite para o número de tarefas que o AsyncTask pode ter em sua fila por vez, posso estar acertando isso.Essa barra foi levantada?

Existe uma maneira de aumentar esse limite?É seguro simplesmente ignorar esta exceção? (tendo um vazio catch(RejectedException e){} bloquear?)

Estou executando este código no emulador Android 1.6 e no nível da API em meu código (minSDKVersion é 3).[EDITAR:Adicionadas informações de nível de SDK e API]

Foi útil?

Solução

Lembro -me de ler em algum lugar que existe um limite para o número de tarefas que a AsyncTask pode ter em sua fila de cada vez, eu posso estar atingindo isso.Este bar foi levantado?

AsyncTask parece suportar atualmente 10 threads e uma profundidade de fila de trabalho de 10.Em teoria, isso suportaria apenas 20 itens... se nada mais estiver usando AsyncTask.

Existe uma maneira de aumentar esse limite?

Pegue o código-fonte, modifique-o, coloque-o em seu próprio pacote e use-o.Eu fiz isso com o meu AsyncTaskEx, embora seja baseado na fonte Android 1.5.

É seguro apenas ignorar essa exceção?

Seu trabalho não ficará na fila para execução.Se isso é "seguro" depende de você.Não tenho conhecimento de quaisquer outros impactos no AsyncTask a infraestrutura.

Outras dicas

Eu fiz exatamente a mesma coisa em um aplicativo.

Lançar 20 threads paralelos de uma vez para baixar miniaturas de um servidor e enviá-las para um adaptador de dados não me parece uma boa ideia.Todos esses fios simplesmente tropeçarão uns nos outros e atrapalharão uns aos outros.

Em vez disso, eu lançaria apenas um thread, faria com que ele coletasse as miniaturas em um loop e as adicionasse ao adaptador assim que chegassem.

Você poderia usar o executor serial com AsyncTask.executeOnExecutor para serializar suas tarefas, mas isso limitará a tarefa a apenas uma tarefa simultânea por vez.Pode ser bom ao obter miniaturas:

myAsyncTask.executeOnExecutor(MyAsyncTask.SERIAL_EXECUTOR, [parâmetros]);

O problema é que o número de pendente AsyncTasks para AsyncTask.THREAD_POOL_EXECUTOR é 128.Depois que a fila estiver preenchida, nenhum novo AsyncTasks poderá ser enfileirado.

Do código-fonte do AsyncTask:

private static final BlockingQueue<Runnable> sPoolWorkQueue =
        new LinkedBlockingQueue<Runnable>(128);

Na minha opinião, esse limite não faz absolutamente nenhum sentido e AsyncTask.SERIAL_EXECUTOR tem uma fila ilimitada.

"Seguro" para ignorar - Você precisa ter certeza de que qualquer tipo de notificação que você estava planejando fazer na pós-execução será feita aqui quando você detectar o erro - caso contrário, você poderá deixar algo suspenso se seu outro código fizer suposições sobre receber uma resposta desta tarefa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top