Este post exemplifica uma necessidade que às vezes ocorre em um projeto: executar uma série de tarefas sequencialmente em uma thread.
Para fazer isso temos um recurso em Java que atende perfeitamente ao requisito acima: a estrutura Executor. Um executor é basicamente um gerenciador de threads e tarefas.
O exemplo consiste em executar uma série de tarefas numa única thread que é controlada por um executor. A tarefa vai ser representada por uma classe que vai implementar um Runnable (MyTask). Para não ficar invisível vamos atualizar a tela com o Dialog.
Vamos também usar uma outra thread para definir o Executor e submeter as tarefas para execução e aguardar até o fim de todas as tarefas para encerrar o Dialog ( MyControlThread).
Os códigos:
TesteExecutorsActivity.java
Mostrando postagens com marcador Thread. Mostrar todas as postagens
Mostrando postagens com marcador Thread. Mostrar todas as postagens
segunda-feira, 30 de abril de 2012
quinta-feira, 9 de fevereiro de 2012
Thread, Handler, Runnable e ProgressDialog - Ex02
Neste outro teste vamos simular uma operação demorada e mostrar a evolução do processamento através de um ProgressDialog com uma barra indicadora de progresso.
Alguns detalhes da implementação:
No onClick() do botão eu chamo o método ativaThread() que faz duas coisas: primeiro prepara o ProgressDialog e segundo prepara a thread e a starta.
Na thread fazemos uma contagem de 0 a 100 e a cada iteração enviamos uma atualização da barra de progresso, como estamos em uma thread que não a UI Thread usamos o handler-runnable para isso.
Quando a contagem chega a 100, mudamos o status para concluído e setamos o status da thread para interrupted. (Só para não ficar parado no sleep).
No final, antes de sair da thread o ProgressDialog é fechado e enviamos uma breve mensagem via toast.
Seguem os códigos.
quarta-feira, 8 de fevereiro de 2012
Thread, Handler, Runnable e ProgressDialog - Ex01
Neste teste vamos simular uma operação demorada com tempo indeterminado para terminar.
Como é uma operação demorada a regra número 1 nos diz para não bloquear a UI Thread, então vamos implementar uma thread para fazer o serviço.
Como não podemos alterar a tela diretamente (regra nº 2) vamos usar um handler e um runnable para atualizar a tela estando em outra thread que não a UI Thread.
Alguns detalhes da implementação:
Eu extendo a classe Thread e no construtor eu informo um inteiro que é o número de loops que vou fazer para simular uma operação demorada (cada loop demora aproximadamente 1 segundo).
No método fazerAlgoDemorado(), é o local onde faríamos uma consulta a um servidor, baixariamos um arquivo, ou uma sequência longa de cálculos.
Antes de iniciar a thread é mostrado o ProgressDialog para informar ao usuário que o app vai iniciar uma operação longa. No final, antes de sair da thread o ProgressDialog é fechado e enviamos uma breve mensagem via toast. E como estamos em outra thread, fazemos isso via handler-runnable.
Seguem os códigos.
package br.com.agorandroid.testethread01;
import android.app.Activity;
import android.os.Bundle;
import android.app.ProgressDialog;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
/**
* @author A H Gusukuma
* agorandroid.blogspot.com
*/
public class TesteThread01Activity extends Activity {
Button button;
MyThread mThread;
ProgressDialog mDialog;
Handler mHandler;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button) findViewById(R.id.iniciarthread);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
ativaThread();
}
});
}
private void ativaThread() {
mDialog = ProgressDialog.show(this, "Aguarde", "Processando...", false, false);
mHandler = new Handler();
mThread = new MyThread(5);
mThread.start();
}
private class MyThread extends Thread {
private int numLoops;
public MyThread(int loops) {
numLoops = loops;
}
public void run() {
fazerAlgoDemorado();
mHandler.post(new Runnable() {
@Override
public void run() {
mDialog.dismiss();
Toast.makeText(TesteThread01Activity.this, "Fim da Thread", Toast.LENGTH_LONG).show();
}
});
}
private void fazerAlgoDemorado() {
int i = 0;
do {
try {
Thread.sleep(1000);
i++;
} catch (InterruptedException e) { }
} while (i
Olhem o programa em execução:
Bons códigos!
Como é uma operação demorada a regra número 1 nos diz para não bloquear a UI Thread, então vamos implementar uma thread para fazer o serviço.
Como não podemos alterar a tela diretamente (regra nº 2) vamos usar um handler e um runnable para atualizar a tela estando em outra thread que não a UI Thread.
Alguns detalhes da implementação:
Eu extendo a classe Thread e no construtor eu informo um inteiro que é o número de loops que vou fazer para simular uma operação demorada (cada loop demora aproximadamente 1 segundo).
No método fazerAlgoDemorado(), é o local onde faríamos uma consulta a um servidor, baixariamos um arquivo, ou uma sequência longa de cálculos.
Antes de iniciar a thread é mostrado o ProgressDialog para informar ao usuário que o app vai iniciar uma operação longa. No final, antes de sair da thread o ProgressDialog é fechado e enviamos uma breve mensagem via toast. E como estamos em outra thread, fazemos isso via handler-runnable.
Seguem os códigos.
Olhem o programa em execução:
Bons códigos!
Assinar:
Comentários (Atom)