quinta-feira, 17 de dezembro de 2015

Como criar um contador preciso em Android utilizando TimerTask

A maioria dos exemplos de códigos em Android de contadores executam todo código na Activity principal. 

Neste exemplo mostro uma abordagem de como fazer um contador utilizando TimerTask em uma Classe separada com métodos para controlar o estado de execução , deixando o código mais limpo.

Crie uma classe chamada ContadorTimerTask.java

public class ContadorTimertask {
    private TextView txtView;
    private Timer timer;
    private MyTimerTask myTimerTask;
    private Handler handler;
    private int counter = 0;
    private long delay = 1000;    // Atraso inicial
    private long interval = 1000; // Intervalo de execução
    boolean running = false;

    public ContadorTimertask(TextView txtView) {
        this.txtView = txtView;
        handler = new Handler();
    }
    public long getInterval() {
        return interval;
    }
    public void setInterval(long interval) {
        this.interval = interval;
        this.delay = interval;
    }

    public boolean isRunning() {
        return running;
    }
    public void start() {
        if (running == false) {
            running = true;
            timer = new Timer();
            timer.schedule(new MyTimerTask(), delay, interval);
        } else {
            Log.i("LOG", "ALREADY RUNNING");
        }
    }
    public void stop() {
        running = false;
        if (timer != null) {
            timer.cancel();
        }
        counter = 0;
        txtView.setText("0");
    }
    public void pause() {
        running = false;
        if (timer != null) {
            timer.cancel();
        }
    }
    class MyTimerTask extends TimerTask {
        @Override
        public void run() {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    counter++;
                    txtView.setText("" + counter);
                }
            });
        }
    }

}


Como utilizar esta classe:
1) Cria uma instância da classe e passe o EditText no construtor
2) Configure o intervalo de execução
3) Utilize os métodos start(), stop(), pause()

Exemplo de como utilizar a Classe no MainActivity


public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Button startButton = (Button) findViewById(R.id.start_button);
        final Button stopButton = (Button) findViewById(R.id.stop_button);
        final TextView txtView = (TextView) findViewById(R.id.txtview);

        // Crie uma nova instância da classe
        final ContadorTimertask contador = new ContadorTimertask(txtView);
        // Configure o intervalo de execução
        contador.setInterval(1000); // Executa a cada 1 segundo
       // Evento do clique do botão start         startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!contador.isRunning()) {
                    contador.start();    // Inicia o contador
                    startButton.setText("PAUSAR");
                } else {
                    contador.pause();   // Pausa o contador
                    startButton.setText("CONTINUAR");
                }
            }
        });
        // Evento de clique do botão stop
        stopButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                contador.stop();      // Para o contador (zera contagem)
                startButton.setText("INICIAR");
            }
        });
    }

}

Vídeo do exemplo:





Nenhum comentário:

Postar um comentário