sexta-feira, 10 de fevereiro de 2012

AsyncTask e ProgressDialog - Ex04

Neste post vamos usar a AsyncTask para fazer o mesmo trabalho do post Thread, Handler, Runnable e ProgressDialog - Ex02
 Neste teste usamos todos os quatro métodos de uma AsyncTask:
 1. No onPreExecute, atualizamos o ProgressDialog
 2. No doInBackground, é onde fazemos todo o serviço. E como estamos em outra Thread, nos comunicamos com o ProgressDialog via o método publishProgress(total) enviando o contador para o método onProgressUpdate.
 3. No onProgressUpdate, atualizamos o ProgressDialog.
 4. No onPostExecute, fechamos o ProgressDialog e enviamos uma breve mensagem via toast.
 Seguem os códigos!





Bons códigos!

Singleton

Esta eu publiquei no Portal Android.

 Muitas vezes precisamos compartilhar dados entre activities, uma forma de fazer isso é por meio de uma classe tipo Singleton.
 Um Singleton é uma classe que permite a criação de uma única instância da classe. O código para ser um singleton precisa controlar a unicidade de instância.
 No código abaixo: - construtor da classe é private - getInstance só dá um new se instance for null. Vamos fazer um exemplo. Vamos criar uma nova classe com o nome MySingleton (file>new>class...).



E usamos a classe assim:


E em outra activity:


OBS: Este exemplo é para acesso não concorrente. Para compartilhar entre activity-activity, activity-service. Se for usar com threads precisa ser sincronizado.

Atualização: Veja mais sobre Singleton Singleton 2


Bons códigos!
Abraços

AsyncTask e ProgressDialog - Ex03

  Para efeito de comparação com o post http://agorandroid.blogspot.com/2012/02/thread-handler-runnable-e.html, vamos fazer a mesma coisa usando no lugar da Thread, Handler e Runnable um exemplo com a classe AsyncTask.
  Fica um código mais simples, intuitivo e clean!
  A classe AsyncTask permite fazer operações em background e publicar os resultados na UI thread. Uma AsyncTask é definida através de 3 tipos genéricos, chamados Params, Progress e Result e por 4 métodos, chamados onPreExecute, doInBackground, onProgressUpdate and onPostExecute.
  Nem vou comentar. Seguem os códigos!






Bons códigos!

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.







Vejam a app em execução:



Bons códigos!

PS: Alterei a variável total para volatile, pois ela é acessada por duas threads.



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.







Olhem o programa em execução:



Bons códigos!


As regras sagradas do Android


O Android tem duas regras sagradas:
1. Não bloqueie a UI Thread.
2. Não atualize a tela através de uma outra thread.
Ou seja, não faça nada demorado na UI Thread e só atualize a tela pela UI Thread.
Para isso temos os seguintes recursos para implementar um código que cumpra as regras acima:
1. Thread
2. Runnable
3. Handle
4. AsyncTask
Ao fazer algo demorado em segundo plano é de bom tom avisar o usuário de que estamos trabalhando, então podemos usar o ProgressDialog para isso.
Nos próximos posts vou mostrar alguns testes que andei fazendo.