Ver mensagens sem resposta | Ver tópicos ativos Hoje é 12 Nov 2019, 10:25



Responder Tópico  [ 10 Mensagens ] 
 [Mini Tuto] Thread, Handler, Runnable e ProgressDialog - 01 
Autor Mensagem
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
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
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


08 Fev 2012, 21:36
Perfil
Anatomy of an App
Anatomy of an App

Data de registro: 12 Mar 2013, 01:37
Mensagens: 186
Mensagem Re: [Mini Tuto] Thread, Handler, Runnable e ProgressDialog -
Valeu pela dica!!!


09 Jun 2013, 20:19
Perfil
Hello World!
Hello World!

Data de registro: 15 Mar 2012, 16:36
Mensagens: 22
Mensagem Re: [Mini Tuto] Thread, Handler, Runnable e ProgressDialog -
Excelente tutorial "A H Gusukuma", me ajudou bastante.

Estou com um problema e gostaria da sua ajuda :oops:

Eu criei uma thread para ficar olhando no BD se tem algo novo a cada 20 segundos, porem esta congelando a tela, veja o codigo que fiz e que esta no create da minha classe Main.


//| habilita o envio dos eventos da operação
        on = true;
       
        //| Cria o Handler que envia os eventos da operacao
        handler = new Handler();
       
        //| Cria a Thread  que envia os eventos da operacao
        tEnviaEventoOperacao = new Thread() {
            public void run() {
                try {
                    if (on) {
                        //| Verifica se esta conectado
                        switch (tm.getDataState()) {
                            case TelephonyManager.DATA_CONNECTED:
                                //| Informa a qdt de itens a transmitir
                                setTitle("Evento -- Status Transmissão: " + String.valueOf(eventoOperacaoDao.RetQtdATransmitir(db)));
                                //| Envia os eventos
                                envioEventoOperacaoThread.buscaEventoOperacao(db);
                                //| Informa a qdt de itens a transmitir
                                setTitle("Evento -- Status Transmissão: " + String.valueOf(eventoOperacaoDao.RetQtdATransmitir(db)));
                                break;
                            case TelephonyManager.DATA_DISCONNECTED:
                                setTitle("Evento -- Status Transmissão: " + String.valueOf(eventoOperacaoDao.RetQtdATransmitir(db) + ":Desconnectado"));
                                break;
                        }
                        Log.i("LogEr", "entrou handle");
                        handler.postDelayed(this, 10000);
                    } else {
                        Log.i("LogEr", "fim handle");
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    Log.i("LogEr","Erro ao Criar a Thread 'tEnviaEventoOperacao', Erro: " + e.getMessage());
                    //return;
                }
            }
        };
        tEnviaEventoOperacao.start();
 


obrigado.


03 Jul 2013, 18:24
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: [Mini Tuto] Thread, Handler, Runnable e ProgressDialog -
Olá
Não usa o handler para controlar o loop da thread, usa um while ou do while.

_________________
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
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


03 Jul 2013, 21:50
Perfil
Hello World!
Hello World!

Data de registro: 15 Mar 2012, 16:36
Mensagens: 22
Mensagem Re: [Mini Tuto] Thread, Handler, Runnable e ProgressDialog -
A H Gusukuma escreveu:
Olá
Não usa o handler para controlar o loop da thread, usa um while ou do while.


primeiramente obrigado pela resposta amigo.

E como eu faço para controlar o tempo para ela executar novamente, seria
MinhaThread.sleep(20000);?

mais uma vez muito obrigado pela atenção.


04 Jul 2013, 12:16
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: [Mini Tuto] Thread, Handler, Runnable e ProgressDialog -
Sniper 3d escreveu:
A H Gusukuma escreveu:
Olá
Não usa o handler para controlar o loop da thread, usa um while ou do while.


primeiramente obrigado pela resposta amigo.

E como eu faço para controlar o tempo para ela executar novamente, seria
MinhaThread.sleep(20000);?

mais uma vez muito obrigado pela atenção.


Sim. Usa Thread.sleep(20000);

_________________
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
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


04 Jul 2013, 13:09
Perfil
Hello World!
Hello World!

Data de registro: 15 Mar 2012, 16:36
Mensagens: 22
Mensagem Re: [Mini Tuto] Thread, Handler, Runnable e ProgressDialog -
A H Gusukuma escreveu:
Sniper 3d escreveu:
A H Gusukuma escreveu:
Olá
Não usa o handler para controlar o loop da thread, usa um while ou do while.


primeiramente obrigado pela resposta amigo.

E como eu faço para controlar o tempo para ela executar novamente, seria
MinhaThread.sleep(20000);?

mais uma vez muito obrigado pela atenção.


Sim. Usa Thread.sleep(20000);


Opa, muito obrigado pela ajuda amigo.

funcionou perfeitamente. /uu


04 Jul 2013, 20:25
Perfil
What is Android?
What is Android?

Data de registro: 17 Ago 2012, 19:47
Mensagens: 4
Mensagem Re: [Mini Tuto] Thread, Handler, Runnable e ProgressDialog -
Prezado colega,

Em primeiro lugar parabéns pelo artigo.

Tenho uma dúvida e espero que possa me ajudar - como faço para retornar para o handle a mensagem de erro caso ele ocorra ?

Por exemplo, tenho uma rotina que transmite pedidos para um servidor e se ocorre algum erro não consigo mostrar o mesmo na tela. É possível fazer isto ?

Obrigado,

Marcello Cainelli.
Doutor Byte Sistemas


24 Mar 2014, 13:46
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: [Mini Tuto] Thread, Handler, Runnable e ProgressDialog -
Tem sim, basta capturar o erro na clausula catch e, por exemplo, enviar um runnable para executar uma rotina de erro na UI Thread.

_________________
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
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


25 Mar 2014, 09:18
Perfil
What is Android?
What is Android?

Data de registro: 17 Ago 2012, 19:47
Mensagens: 4
Mensagem Re: [Mini Tuto] Thread, Handler, Runnable e ProgressDialog -
No final fiz uma coisa muito simples que resolveu. Capturei o erro no catch como vc sugeriu e joguei em uma variável string e apresento o mesmo em um toast.

Obrigado pela dica.


25 Mar 2014, 10:13
Perfil
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 10 Mensagens ] 

Quem está online

Usuários vendo este fórum: Aderbal Nunes, alexvbh, am2net, andre.hebeler, andrewort, Aniquiler, arquivo51, Avelino Mateus Neto, BMaia, BOMBER27, brcamp, caio, canaville, capo, cariabs8, Carlos, carlosavasconcelos, cassiano, cavenaghi, celson, cenatech, cesao, Chassot, china, craudiao, criscmaia, Cristranus, danilosv, dariosena, Demerval, Diego, difrene, dikiloco, Dookan, Dorpho, Douglas Siviotti, dr.faro, ederson_4, edlinux, edson dias de gusmao, edsonel, Eliezer Reis, eloilton, erikopa, estratec, fcoroa, Felipe, felipedornelas, Fernando Cardia, fernandodotnet, fracon, fraga, francismarconcini, freak, genildof, glmsistemas, Gomes, guiba_picolino, HanNiBaLSeTDf, helder84, inaciofernandes, inesfg, jacksaum, jacksonst, jacksonvpj, JairoCN, Jalerson, Jar Jar Binks, jcdeveloper, jhonguitar, jijo, jlucasps, jmarcos14, jrsilva, Juninhooooo, JuniorE, juniorfranca, Juniorvs, kennedyximenes, klausenner, konos, kristopher, Leonardo, leonardodamata, levita, lucasmadeira, luciano.sml, MarceloMC, marcelosv, marlovich, mayahaslinger, Mayara Trevisol, Microdesk, mlemos, Moisés Souto, MSN NewsBlogs, nandopierre, NeruLL, Nice, nilsgome, Odigooogle™, otpor, paulo.esantos, peixe, pfsmorigo, pgsnit, phpower1, phsantos, piantino, PicsearchDroid, polonia, Qui-Gon Jinn, rafsantos, ramonsa, raragao, Ricardo Chikasawa, Roberto, Robson Florentino, robsonrg, rocha, Romulo, romuloff, romuloigor, rotilho, sergio, sidnei.gs, Silvio Vaz, SirBagda, suissa, tChAnDy, Telekom [Bot], thiago20, thosjanas, tnarnold, ton.soares, tricx16, vaniuz, vicfalmac, vieira, W3 [Sitesearch], wagner_francisco, zeantonio 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

Procurar por:

© 2007 - 2016 Portal Android - Comunidade de Desenvolvedores Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi