A plataforma Android nos fornece uma quantidade muito grande de classes e interfaces que facilitam o desenvolvimento e permitem a construção de um código limpo. Um bom exemplo disso são as tarefas assíncronas e, a classe AsyncTask.
A forma de uso é extremamente simples, basta termos uma classe que extenda AsyncTask. Por exemplo:
Ao extender AsyncTask, somos obrigados a sobrescrever o método doInBackground, onde será feito o processamento multithreading e de forma assíncrona. Por exemplo, podemos ter um acesso e um parser XML ou JSON, uma rotina que salva uma grande quantidade de dados em um banco de dados relacional ou, um extenso processamento de imagens.
Fique atento também ao fato de termos alguns tipos identificados na hora do extends:
Estes são, respectivamente:
* Params: parâmetros que serão passados para o método doInBackground ao chamarmos o AsyncTask com o método execute();
* Progress: tipo de dado que será passado no método publishProgress();
* Result: tipo de dado que será retornado pelo método doInBackground. Ou seja, se no lugar de Void, passarmos String, o método teria esta assinatura:
E como utilizamos a classe MeuAsyncTask? Desta forma:
Mas esta classe ainda nos fornece algumas features interessantes: onPreExecute e onPostExecute. Estes métodos servem para definirmos alguma ação que desejamos executar antes da tarefa assíncrona (onPreExecute) e o que desejamos fazer depois que a tarefa for concluída (onPostExecute). Veja como ficaria a classe:
Perceba que o mesmo tipo de parâmetro passado ao método onPostExecute será o tipo Result, passado na assinatura da classe e, consequentemente, o tipo de retorno que será informado na assinatura do método doInBackground. Por exemplo, vamos mudar o Result para a classe Hashtable:
O que é importante disso? A API nos fornece métodos que serão chamados no exato instante em que a tarefa assíncrona está prestes a começar e quando ela terminou. Nosso código fica limpo e temos controle total da operação.
Mas, ainda tem mais. E se quisermos ter uma barra de progresso indicando o andamento da tarefa, a AsyncTask nos ajuda de alguma forma? Sim. Basta sobrescrever o método onProgressUpdate. Veja:
Este método será chamado automaticamente quando, de dentro do doInBackground, acionarmos o método publishProgress(). Perceba que o mesmo tipo de parâmetro passado ao publishProgress() será recebido pelo onProgressUpdate(). Sendo que, este tipo é definido na asinatura da classe. No item Params.
No método onProgressUpdate podemos utilizar o valor recebido como parâmetro e mudar um Widget, como uma barra de progresso ou, mostrar uma mensagem ao usuário com um Toast, por exemplo.
O importante é que a classe AsyncTask nos fornece um arcabouço pronto para termos controle total de uma tarefa assíncrona.
Espero ter mostrado todo o poder da classe para vocês. Qualquer dúvida estou a disposição.
Att. Ricardo
A forma de uso é extremamente simples, basta termos uma classe que extenda AsyncTask. Por exemplo:
class MeuAsyncTask extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
return null;
}
}
Ao extender AsyncTask, somos obrigados a sobrescrever o método doInBackground, onde será feito o processamento multithreading e de forma assíncrona. Por exemplo, podemos ter um acesso e um parser XML ou JSON, uma rotina que salva uma grande quantidade de dados em um banco de dados relacional ou, um extenso processamento de imagens.
Fique atento também ao fato de termos alguns tipos identificados na hora do extends:
<Void, Void, Void>
Estes são, respectivamente:
* Params: parâmetros que serão passados para o método doInBackground ao chamarmos o AsyncTask com o método execute();
* Progress: tipo de dado que será passado no método publishProgress();
* Result: tipo de dado que será retornado pelo método doInBackground. Ou seja, se no lugar de Void, passarmos String, o método teria esta assinatura:
@Override
protected String doInBackground(Void... params) {
return null;
}
E como utilizamos a classe MeuAsyncTask? Desta forma:
MeuAsyncTask asyncTask = new MeuAsyncTask();
asyncTask.execute();
Mas esta classe ainda nos fornece algumas features interessantes: onPreExecute e onPostExecute. Estes métodos servem para definirmos alguma ação que desejamos executar antes da tarefa assíncrona (onPreExecute) e o que desejamos fazer depois que a tarefa for concluída (onPostExecute). Veja como ficaria a classe:
class MeuAsyncTask extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
Perceba que o mesmo tipo de parâmetro passado ao método onPostExecute será o tipo Result, passado na assinatura da classe e, consequentemente, o tipo de retorno que será informado na assinatura do método doInBackground. Por exemplo, vamos mudar o Result para a classe Hashtable:
protected Hashtable doInBackground(Void... params)
protected void onPostExecute(Hashtableresult)
O que é importante disso? A API nos fornece métodos que serão chamados no exato instante em que a tarefa assíncrona está prestes a começar e quando ela terminou. Nosso código fica limpo e temos controle total da operação.
Mas, ainda tem mais. E se quisermos ter uma barra de progresso indicando o andamento da tarefa, a AsyncTask nos ajuda de alguma forma? Sim. Basta sobrescrever o método onProgressUpdate. Veja:
@Override
protected void onProgressUpdate(Void... values) {
    super.onProgressUpdate(values);
}
Este método será chamado automaticamente quando, de dentro do doInBackground, acionarmos o método publishProgress(). Perceba que o mesmo tipo de parâmetro passado ao publishProgress() será recebido pelo onProgressUpdate(). Sendo que, este tipo é definido na asinatura da classe. No item Params.
No método onProgressUpdate podemos utilizar o valor recebido como parâmetro e mudar um Widget, como uma barra de progresso ou, mostrar uma mensagem ao usuário com um Toast, por exemplo.
O importante é que a classe AsyncTask nos fornece um arcabouço pronto para termos controle total de uma tarefa assíncrona.
Espero ter mostrado todo o poder da classe para vocês. Qualquer dúvida estou a disposição.
Att. Ricardo
Comentários
Tenho o meu codigo no stackoverflow em : http://stackoverflow.com/questions/20449152/asynctask-freezes-ui-while-replacing-fragments
Thanks ;)