AsyncTask – Executando tarefas em segundo plano

Cópia fiel de: http://zarelli.wordpress.com/

Android AsyncTask

AsyncTask um Substituto de Threads e Handles

Como todo desenvolvedor Android sabe, é bem chato mexer com Threads, ainda mais quando há necessidade de atualizar a interface, para isso atualmente usamos a famosa ThreadUI ou Handler.

Pesquisando, encontrei uma maneira de trabalhar com essas Threads distintas facilmente utilizando a classe AsyncTask, com ela nos não precisamos nos preocupar com o tal de Handler. Nela executamos qualquer processo paralelamente e temos um método responsável por atualizar a interface.

Quando estendemos a AsyncTask ele nos obriga a definir três tipos de classes:

(defini esses tipos como exemplo)

extends AsyncTask<string, object, integer>

    1. O primeiro tipo ira definir o tipo que será passado para o método doInBackground(String… paramss), esses parâmetros vão ser passados ao executarmos o processo.
    2. O segundo tipo ira definir o tipo que será passado para o método onProgressUpdate(Object… values).
    3. O terceiro tipo ira definir o retorno do método doInBackground, assim que termina a execução do doInBackground esse tipo será retornado para o método onPostExecute(Integer… values).

Ao implementar uma classe que extend a AsyncTask podemos sobrescrever os seguintes métodos:

1 – onPreExecute.

É chamado antes de executar o processo (doInBackground), Podemos utilizar para criarmos um ProgressDialogo. Este método roda em Thread de interface.

2 – doInBackground

É responsável pelo processo. ex: uma busca em um webservice, algum download, qualquer processo que demanda tempo e processamento.

Não podemos utilizar este método para atualizarmos nossa interface, para isso temos a onProgressUpdate, MAS NÃO CHAMAREMOS ELA DIRETAMENTE para isso temos o métodopublishProgress que fica responsável por chamar a onProgressUpdate.

3 – onPostExecute

Este método recebera um parâmetro do doInBackground, ele é responsável em terminar a execução do processo, por exemplo finalizar um ProgressDialogo.

4 – onProgressUpdate

Este método é responsável em atualizar nossa interface. Chamamos ele atravéz do método publishProgress

Na pratica isso facilita e muito, acabando com os problemas de atualizar interface fora de um handler! mensagem de erro muito comum acredito!.

Segue um exemplo de como implementar um processo que demanda tempo, sempre atualizando a interface.

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;

public class MainActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        /** Chamando o Processo AsyncTask
         *  Os parametros passado no método execute, vão para o método
         *  doInBackground(Integer... params).
         */
        Processo processo = new Processo(this);
        processo.execute(3000, 2000, 4000);
    }

    public class Processo extends AsyncTask<integer, string,="" integer="">
    {

        private ProgressDialog progress;
        private Context context;

        public Processo(Context context)
        {
            this.context = context;
        }

        @Override
        protected void onPreExecute()
        {
            //Cria novo um ProgressDialogo e exibe
            progress = new ProgressDialog(context);
            progress.setMessage("Aguarde...");
            progress.show();
        }

        @Override
        protected Integer doInBackground(Integer... paramss)
        {
            for (int i = 0; i < paramss.length; i++)
            {
                try
                {
                    //Simula processo...
                    Thread.sleep(paramss[i]);
                    //Atualiza a interface através do onProgressUpdate
                    publishProgress(i + "...");
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            return 1;
        }

        @Override
        protected void onPostExecute(Integer result)
        {
            //Cancela progressDialogo
            progress.dismiss();
        }

        @Override
        protected void onProgressUpdate(String... values)
        {
            //Atualiza mensagem
            progress.setMessage(values[0]);
        }
    }
}
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s