|
Página 1 de 1
|
[ 1 Mensagem ] |
|
[Mini Tuto] Thread, Handler, Runnable e ProgressDialog - 01
| Autor |
Mensagem |
|
A H Gusukuma
Dalvik Virtual Machine
Data de registro: 17 Jul 2011, 10:55 Mensagens: 1995 Localização: São Paulo
|
 [Mini Tuto] Thread, Handler, Runnable e ProgressDialog - 01
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. 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<numLoops ); } }} <?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" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:text="Iniciar Thread" android:id="@+id/iniciarthread" android:layout_width="fill_parent" android:layout_height="wrap_content"> </Button> </LinearLayout>
Bons códigos!
_________________Abraços ___________ Novo App: CalcMat - Calculadora de materiais para concreto Blog: Agorandroid - sobre programação Android Twitter: @Agorandroid ___________ Campanha: Facilite sua vida e a dos outros usuários Netiqueta:Procure responder as sugestões. Quando encontrar a solução, coloque [Resolvido] no primeiro post o mais rápido possível. Lembre-se de agradecer às pessoas que ajudaram e poste a solução do problema.
|
| 08 Fev 2012, 20:36 |
|
|
|
Página 1 de 1
|
[ 1 Mensagem ] |
|
Quem está online |
Usuários vendo este fórum: adelar, agtavares, Alan Unger, alex.abrantes, alexcost2002, alexvbh, alfredo_ej, alineri, aluclinux, am2net, arnaldo.miranda, Arthas, baudamix, Bitetti, BMaia, BornSlip, boydivalor, Bravox, bravus, brian15, brpiassa, C-3PO, caiodemarco, Carlos Almeida, carlos.macleod, Carmizini, cfranca, charly, china, claudioalfonso, compto, criscmaia, Cristranus, cyzko, DaDih*, danilosv, Dassi, David, dbuarque, deborazb, Delão, Diego Otani, Diego Rufino, Dirceu W. C. Conte, dkclan, e-azuos, Eduardo, eferrari, eliasmachado_rj, fabielp, fabric01, Faroli, felipecomp19, Filipe larizzatti, flaviohssantos, fracon, Francisco_Geraldo, gphonemania, grandebaro, Gui Pereira, GuilhermeZampieri, guto.pro, HanNiBaLSeTDf, hebert, Heritrix, hostdesigner, italoraony, jacksonvpj, jasn, Jenius, Jless@, jlucasps, jrsilva, juliancesar, Juliobcosta, juliomar, kennedyximenes, lalaine, leanderdulac, leeeeooooooo, Legiao, leoadias, LucasNascimento, luizcyber, maiconjunches, mam_computer, MarceloMC, marcelosv, marciosoliveira, marinho5, maurofjr, Mayara Trevisol, mlemos, monteirojp, mvoto, nandopierre, neiesc, nocivus, nullPointer, Nute Gunray, Obi-Wan Kenobi, oliverlessa, On_7, otpor, pabarbosa, pererinha, pgbatera, piantino, pilon, pingumanbr, ramonsa, rananfu, reginaldofdias, regisjj, renegheller, ricardo, robertofonte, Rogério, Romulo, Roney dos Santos, ruizsa, Samantha, sergio, SERGIO RODRIGUES, sidnei.gs, siker C3PO, SirBagda, Stryder, Synoo [Bot], Telekom [Bot], Teodoro, tiagofalcao, tricx16, Vania, Vector, vicfalmac, Vinicius, xGambit e 5 visitantes |
|
Você não pode criar novos tópicos neste fórum Você não pode responder tópicos neste fórum Você não pode editar suas mensagens neste fórum Você não pode excluir suas mensagens neste fórum Você não pode enviar anexos neste fórum
|
|