quinta-feira, 23 de fevereiro de 2012

Android - ProgressDialog

Olá,

Hoje irei mostrar como utilizar a classe ProgressDialog, ela é de grande utilidade em nosso sistemas, principalmente quando o sistema precisa efetuar alguma operação mais demorada e não deixar o usuário com aquela sensação de que o sistema travou.

Existem dois tipos de ProgressDialog que podem ser utilizados:
1 - Loop infinito - Quando você não consegue precisar quando a operação vai terminar, exemplo uma consulta a base de dados que seja muito demorada
2 - Loop finito - Quando por exemplo, você sabe exatamente a quantidade de registros que o seu sistema irá processar.

Como já de costume todos os fontes abaixo estão com vários comentários para facilitar o aprendizado.

Arquivo main.xml, layout da única tela apresentada nesse projeto:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <Button 
        android:text="Progress 1" 
        android:id="@+id/button1" 
        android:onClick="Progress1_Click"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content">
    </Button>
    <Button 
        android:text="Progress 2" 
        android:id="@+id/button2" 
        android:onClick="Progress2_Click"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content">
    </Button>
</LinearLayout>

Arquivo main.java:
package br.com.EscaloDeAndroid.Progress;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

public class main extends Activity {
    
    private ProgressDialog mprogressDialog;
    private Handler mhandler;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mhandler = new Handler();
    }
    
    //o botão abaixo irá simular um processo em que não sabemos quanto tempo
    //ele irá demorar
    public void Progress1_Click(View v)
    {
        //cria o progress dialog
        mprogressDialog = ProgressDialog.show(main.this, "Aguarde", "Processando...");

        
        new Thread() {
            public void run() {
                //criando instância de classe para executar um método qualquer
                teste lteste = new teste();
                try{
                    //esse é apenas um método de teste que pode ser demorado
                    lteste.Esperar(10); 
                } catch (Exception e) {
                    Log.e("tag", e.getMessage());
                }
                //encerra progress dialog
                mprogressDialog.dismiss();
            }
        }.start();
    }
    
    //o botão abaixo irá simular uma barra com progressão
    //e poderemos monitorar seu progresso
    public void Progress2_Click(View v)
    {
        mprogressDialog = new ProgressDialog(this);
        mprogressDialog.setCancelable(true);
        mprogressDialog.setMessage("Processando...");

        //define o estilo como horizontal que nesse caso signifca que terá 
        //barra de progressão/contagem
        mprogressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

        //reseta o progress para zero e em seguida define o valor máximo
        mprogressDialog.setProgress(0);
        mprogressDialog.setMax(8); //esse valor deverá ser definido de acordo com sua necessidade

        //apresnta o progressbar
        mprogressDialog.show();
        
        new Thread() {
            public void run() {
                //criando instância de classe para executar um método qualquer
                teste lteste = new teste();
                try{
                    while (mprogressDialog.getProgress() < mprogressDialog.getMax()) {
                        //esse é apenas um método de teste que pode ser demorado
                        lteste.Esperar(1);
                        mprogressDialog.incrementProgressBy(1);
                    }
                } catch (Exception e) {
                    Log.e("tag", e.getMessage());
                }
                
                //Exibe mensagem apenas informando o fim da execução da thread
                mhandler.post(new Runnable() {
                    public void run() {
                        Toast.makeText(getApplicationContext(), "Acabou", Toast.LENGTH_LONG).show();
                    }
                });            
                
                //encerra progress dialog
                mprogressDialog.dismiss();
            }
        }.start();
    }
}


Abaixo segue o arquivo teste.java:
package br.com.EscaloDeAndroid.Progress;

public class teste extends Thread {
    public void Esperar(int pintSegundos)
    {
        try {
            //simulando um processo demorado
            Thread.sleep(pintSegundos * 1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


Como resultado temos as seguintes imagens:
 


Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.


Desenv com qualidade!

5 comentários:

Rodrigo Borba disse...

Muito bom, parabéns.

Marcio de Souza disse...

Rodrigo,

Obrigado pela visita!

SkyLine disse...

Curti também!!

Desculpe não pude evitar de testar... quando você cancela e roda de novo a barrinha dai ela carrega mais rápido, como eu poderia fazer para parar a Thread também? Existe algum "onFailure"?

Vlw

Rodrigo Piva disse...

Muito bom, parabéns

Estou iniciando meus estudos com o Android, e esse post me ajudou muito.

Anônimo disse...

Você usa Teste e Espera?????? não entendi