Ver mensagens sem resposta | Ver tópicos ativos Hoje é 20 Mai 2013, 10:31



Responder Tópico  [ 1 Mensagem ] 
 [Mini Tuto] Thread, Handler, Runnable e ProgressDialog - 01 
Autor Mensagem
Dalvik Virtual Machine
Dalvik Virtual Machine

Data de registro: 17 Jul 2011, 10:55
Mensagens: 1990
Localização: São Paulo
Mensagem [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
Perfil
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 1 Mensagem ] 

Quem está online

Usuários vendo este fórum: adelar, alberto, albinoneto, Alex Marcelo Burnett, alexcost2002, Alexsandro Tirloni, am2net, ANDRE FELIX DE ASSIS, ARAKINIDIO, arnaldo.miranda, avsouza, BiG_SerGiO, Bitor, BMaia, bozzano, brcamp, Bruno, bruno.abd, caio, caliow, carlos.macleod, Chanceler Supremo Finis Valorum, chunga, cleiton_maciel, compto, Crazy_Droid, dalmeidabr, Damiani Oliveira, dentimskol, Diego Rufino, diegorrborges, dnakamashi, dreyer, drjunior, edson dias de gusmao, Eduardo - Brasil, edwarvelarde, emersonalencar, Eneias, erissi, fabrizior, felipecomp19, felipetesc, fgalvão, Filipe larizzatti, flashking, fmakula, Gabriel, garretereis, geco, Gomes, gutem25, gutomilani, inaciofernandes, inesfg, ixian, jacksaum, Jaison, Jango Fett, joaquimfoto, João Miguel Aguiar, jrchuteboxe, JRSIQUEIRA, juliana_costa, julianafsa, juliherms, Juniorvs, Knut, Kureiton, kusanaguy, leofernandesmo, lfirpo, lisbao, loferreira, lucianno, luiz, luiz.lago, Lúcio Zanette, marcelochiquinho, MarceloLuz, Marco Magoo, Mig, mlemos, mmiottobarbosa, mtomazzi, n3t0, nakahara, nandokanarski, neosun, Newton Barbosa, nfaria, niloleite, nsansilva, osternack, pabarbosa, pamonteiro, pbcjunior, phfmendes, phobos, piagg, R2-D2, rafsantos, ramonrabello, Ranieri, rlecheta, rmendes, Roberto, rogerio.alcantara, romuloff, ronamore, ScoobyGB, sergio, siker C3PO, skcratch, Stormtrooper, ton.soares, tonylock, Topeca, unnamedd, vandob, vanmars, W3 [Sitesearch], williamcmello e 2 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

Procurar por:

© 2007 - 2013 Portal Android - Comunidade de Desenvolvedores da Plataforma Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi