AsyncTaskLoader vs AsyncTask

129

Desde Honeycombe v4 Compatibility Libraryé possível usar AsyncTaskLoader. Pelo que entendi, o AsyncTaskLoaderpode sobreviver através de alterações de configuração, como inversões de tela.

É recomendável usar em AsyncTaskLoadervez de AsyncTask? Será que LoaderManagerobter na foto também?

Mas não encontrei bons exemplos sobre como usar corretamente o AsyncTaskLoader. Os documentos também não fornecem exemplos. Alguém pode fornecer alguns bons exemplos.

OKA
fonte

Respostas:

51

Você pode dar uma olhada no código fonte da biblioteca de compatibilidade para obter mais informações. O que um FragmentActivityfaz é:

  • manter uma lista de LoaderManager's
  • verifique se eles não são destruídos quando você liga o telefone (ou ocorre outra alteração na configuração) salvando instâncias usando onRetainNonConfigurationInstance()
  • chute o carregador certo quando você chamar initLoader()sua atividade

Você precisa usar o LoaderManagerpara fazer interface com os carregadores e fornecer os retornos de chamada necessários para criar seu (s) carregador (es) e preencher suas visualizações com os dados que eles retornam.

Geralmente deve ser mais fácil do que gerenciar AsyncTaskvocê mesmo. No entanto, AsyncTaskLoadernão está exatamente bem documentado; portanto, você deve estudar o exemplo nos documentos e / ou modelar seu código depois CursorLoader.

Nikolay Elenkov
fonte
5
Vou dar uma olhada nisso. Talvez seja muito cedo para encontrar bons exemplos AsyncTaskLoadere, quando mais desenvolvedores começarem a usá-lo, mais exemplos virão.
OKA
47

Ao comparar o AsyncTaskLoader x O AsyncTask , como você deve saber ao girar a tela do dispositivo, ele pode destruir e recriar sua atividade, para deixar claro que a imagem gire o dispositivo durante a transação de rede:

O AsyncTask será reexecutado como thread de segundo plano novamente, e o processamento anterior do thread de segundo plano seria redundante e zumbi.

O AsyncTaskLoader será apenas reutilizado com base no Loader ID registrado no Loader Manager antes, portanto, evite executar novamente a transação de rede.

Em resumo, o AsyncTaskLoader evita a duplicação de threads em segundo plano e elimina a duplicação de atividades zumbis.

Hoang Duc Dong
fonte
11

O AsyncTaskLoader executa a mesma função que o AsyncTask , mas um pouco melhor. Ele pode lidar com alterações de configuração de atividade mais facilmente e se comporta nos ciclos de vida de fragmentos e atividades. O bom é que o AsyncTaskLoader pode ser usado em qualquer situação em que o AsyncTask esteja sendo usado. Sempre que os dados precisam ser carregados na memória para a Atividade / Fragmento manipular, o AsyncTaskLoader pode fazer o trabalho melhor.

Existem alguns problemas com o uso de AsyncTasks, no entanto:

  • Mudanças na configuração podem atrapalhar as coisas
  • Pausar uma atividade não pausa o AsyncTask
  • Uma quantidade razoável de código padrão (o que significa mais erros possíveis)

Doc do AsyncTaskLoader

Attif
fonte
8

Algumas diferenças além das descritas em outras respostas:

Ao usar o AsyncTaskLoader sobre o AsyncTask :

  • O AsyncTaskLoader nos dá liberdade para carregar dados em cache antigos até que novos dados sejam retornados porforceLoad()

  • Podemos definir atrasos para AsyncTaskLoader , setUpdateThrottle()impedindo atualizações consecutivas no cliente (Activity / Fragment)

  • O AsyncTaskLoader pode ser compartilhado com vários fragmentos se eles tiverem atividade pai comum e se foi iniciado a partir degetActivity().getSupportLoaderManager()

  • O AsyncTaskLoader é destruído LoaderMangerquando sua atividade vinculada não está mais disponível. enquanto precisamos destruir manualmente o AsyncTasks se a atividade do chamador destruir. Isso economiza nosso tempo de escrever todas as coisas de limpeza. O AsyncTaskLoader funciona bem com seus respectivos ciclos de vida.

Portanto, o AsyncTaskLoader é muito melhor que o AsyncTask.

Palak Darji
fonte