Ver mensagens sem resposta | Ver tópicos ativos Hoje é 24 Mai 2013, 06:43



Responder Tópico  [ 3 Mensagens ] 
 [Tutorial] Thread em Android 
Autor Mensagem
What is Android?
What is Android?

Data de registro: 12 Set 2011, 21:34
Mensagens: 4
Mensagem [Tutorial] Thread em Android
Bom pessoal como eu sofri com isso no começo eu vou colocar aqui um tutorial bem rápido de Thread no Android.

Bom primeiro de tudo é que você precisa saber que no Android nós precisamos de uma classe chamda Handler. Ele permite você fazer com que outras classes que implemente a interface Runneble troquem mensagens entre si e altere os estados dos objetos. Bom chega de bla bla bla, se que quiser saber um pouco mais sobre essa classe http://developer.android.com/reference/ ... ndler.html.

O projeto:
* Você vai precisar criar o projeto com o nome de testeThread
* O pacote padrão será app.teste
* Dentro desse pacote você irá criar as classes Processo que implementa Runneble e a classe TesteThreadActivity que extende Activity e implementa OnClickListener.
----- Classe Processo:


package app.teste;

import android.util.Log;
import android.widget.Button;

public class Processo implements Runnable{

    public Processo(TesteThreadActivity testeThreadActivity){
        this.testeThreadActivity = testeThreadActivity;
        button = null;
        rodando = true;
        i = 0;
    }
   
    private int i;
   
    private TesteThreadActivity testeThreadActivity;
   
    private Button button;
   
    private static boolean rodando;
   
    public synchronized static boolean getRodando() {
        return rodando;
    }

    public synchronized static void setRodando(boolean _rodando) {
        rodando = _rodando;
    }
   
    @Override
    public void run() {
        while (rodando) {
            try {              
                if (button == null) {
                    testeThreadActivity.getHandler().post(new Runnable() {
                       
                        @Override
                        public void run() {
                            button = testeThreadActivity.getButton();
                            button.setText(Integer.toString(i));
                            button = null;
                        }
                    });
                }
                i++;
                Thread.sleep(1000);        
            } catch (Exception e) {
                Log.e("ERRO!!!", "Erro no método RUN:\n" + e.getMessage());
            }          
        }
    }
}
 

----- Classe TetseThreadActivity:


package app.teste;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RelativeLayout;

public class TesteThreadActivity extends Activity implements OnClickListener{

    private Handler handler;
   
    private Thread thread;
   
    private Button button;
   
    private RelativeLayout relativeLayout;
   
    public synchronized Button getButton(){
        return this.button;
    }
   
    public synchronized Handler getHandler(){
        return this.handler;
    }
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        try {
           
            button = new Button(this);
            button.setText(Integer.toString(0));
            button.setOnClickListener(this);
           
            relativeLayout = (RelativeLayout)findViewById(R.id.relativeLayout1);
            relativeLayout.addView(button);
           
            handler = new Handler();
           
            thread = new Thread(new Processo(this));
           
            thread.start();
           
        } catch (Exception e) {
            Log.e("ERRO!!!", "Erro no método onCreate:\n" + e.getMessage());
        }
    }

    @Override
    public void onClick(View v) {
        if (thread != null) {
            Processo.setRodando(false);
        }
    }
   
    @Override
    protected void finalize() throws Throwable {
        this.thread.stop();
        super.finalize();
    }
}
 


* O main.xml deve ficar assim:

<?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" android:weightSum="1">

    <RelativeLayout
        android:layout_width="fill_parent"
        android:id="@+id/relativeLayout1"
        android:layout_height="fill_parent">

    </RelativeLayout>
</LinearLayout>
 



------------------------------------------------------------------------------------------------------------------------------------------------------------------

Bom vamos agora comentar o que foi feito. É bem simples você está criando dinamicamente na sua classe TesteThreadActivty um botão em uma posição default no seu RelativeLayout. Ele recebe o evento onClick que simplesmente para a thread principal. Após isso você instancia o Handler (o que irá fazer a mágica toda) e uma thread. Agora vamos ver o que a classe Processo faz. ela simplemente recebe no seu método construtor um objeto do tipo TesteThreadActivity, apartir dai ele simplemente roda o método Run que dentro tem algo curioso
testeThreadActivity.getHandler().post()

, ele chama o método post e é ele quem irá fazer uma "ponte" de conversação entre o seu objeto e sua thread. Tudo que você colocar dentro do segundo método Run ele irá sempre "atualizar" os objetos. Nada impede de que você crie uma outra classe no seu projeto que implemente a interface Runneble, e que faça toda a lógica com os estados dosseus objetos e no final você passe um instância dessa classe como parâmetro para o método
post()

.
No final você deve ver um botão que irá atualizar o seu text de um e um segundo, caso você queira que ele pare apenas basta clicar nele.

Bom pessoal esse é o meu primeiro tutorial na comunidade e como você podem ver eu fiz um código bem simples. Caso tenham dúvida postem.


Abraço


16 Set 2011, 13:50
Perfil
Dalvik Virtual Machine
Dalvik Virtual Machine
Avatar de usuário

Data de registro: 05 Abr 2011, 03:47
Mensagens: 1846
Localização: Rio de Janeiro
Mensagem Re: [Tutorial] Thread em Android
Muito bom!!

Só o "thread.stop();" que não ficou muito legal, seta como false, como vc fez em outro lugar e deixa ela parar naturalmente.

Ahh.. deletei o outro tópico igual a esse, vamos deixa só esse aqui!

Abraços!

_________________
Alexandre Antunes
@a3b @bemobi
Motorola Defy

App: IpCalc : Source - Calculadora IP (Máscara, Gateway, Broadcast e Rede).
APP: Guia Carioca - Guia para o turista que visita o Rio de Janeiro e para o carioca que quer conhecer mais sua cidade.
App: MyPonto - Controle de frequência (ponto) pessoal.

Campanha: Facilite sua vida e a dos outros usuários.
Objetivo: Vamos colocar a tag [RESOLVIDO] no título do tópico quando o problema for resolvido.


Use a ferramenta de busca do fórum e não espere tanto para que a sua dúvida seja respondida!

Quer trabalhar comigo??


16 Set 2011, 17:27
Perfil WWW
Dalvik Virtual Machine
Dalvik Virtual Machine

Data de registro: 17 Jul 2011, 10:55
Mensagens: 1997
Localização: São Paulo
Mensagem Re: [Tutorial] Thread em Android
Olá
Só um detalhe, muda o while (rodando) para while (getRodando())
Motivo: não acessar um campo compartilhado por múltiplas threads sem sincronização.

_________________
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.


20 Mar 2012, 14:54
Perfil
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 3 Mensagens ] 

Quem está online

Usuários vendo este fórum: abruzzi, Aderbal Nunes, adolfo, Alan Unger, alex, alex.abrantes, Alexandre de Queiroz, alexvbh, Anderson MarkZ, andi, Aniquiler, antoniodourado, AT-AT, Avelino Mateus Neto, Bitetti, Blackstorm, BMaia, bozzano, bravus, cassianotartari, cehills, charly, CKorneLL, Cleiton, Clone Trooper, compto, craudiao, Darth Maul, Darth Plagueis, Darth Sidious, dfreitas, dobau, Dorpho, faco, flaviohssantos, frances135, freina, gedoor, geeks, Geovanne Duarte, Guilherme Cobain, gustavobarbosa, hbarroco, humberto, ice, inesfg, interservic, ixian, JackBlackJack, jackdaniel, JAndroid, joaquimfoto, Juliobcosta, kleberperea, laucode, leonardodamata, lucasB, Lucious, maolveira, marcelocastellani, Marco Magoo, Marlosm, maurofjr, Mayara Trevisol, Meticore, msmdark, neimarguerra, neosun, NeruLL, nfaria, oliverlessa, PAMinhoto, Patricia, Paulo Bizzo, pchofard, pgbatera, Philipe Alves, pxcx, Rafael, renan.fernandes, ricardo, robertofonte, rocha, rogeriopgomes, Rogério, rotilho, shadow, shazaum, Silvio Vaz, silvio.carlos, snonca, tchou, Teodoro, thiagotomais, Velhinho, Vinicius, W3 [Sitesearch], wagner_francisco, Wenceslau, Wesleyceraso, wil, xGambit, zaquiel 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