Ver mensagens sem resposta | Ver tópicos ativos Hoje é 21 Mai 2013, 14:21



Responder Tópico  [ 1 Mensagem ] 
 [Mini Tuto] Executando tarefas sequencialmente em Thread 
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] Executando tarefas sequencialmente em Thread
Executando tarefas sequencialmente em outra Thread no Android

Este post exemplifica uma necessidade que às vezes ocorre em um projeto: executar uma série de tarefas sequencialmente em uma thread.
Para fazer isso temos um recurso em Java que atende perfeitamente ao requisito acima: a estrutura Executor. Um executor é basicamente um gerenciador de threads e tarefas.
O exemplo consiste em executar uma série de tarefas numa única thread que é controlada por um executor. A tarefa vai ser representada por uma classe que vai implementar um Runnable (MyTask). Para não ficar invisível vamos atualizar a tela com o Dialog.
Vamos também usar uma outra thread para definir o Executor e submeter as tarefas para execução e aguardar até o fim de todas as tarefas para encerrar o Dialog ( MyControlThread).
Os códigos:

TesteExecutorsActivity.java

package br.com.agorandroid.testeexecutors;

import android.app.Activity;
import android.os.Bundle;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
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;


    public class TesteExecutorsActivity extends Activity {
        Button button;
        MyControlThread mThread;
        ProgressDialog mDialog;
        Handler mHandler;
        int LIMITE = 10;
        /** 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 MyControlThread(LIMITE);
            mThread.start();
        }

        private class MyControlThread extends Thread {
            private int numTasks;
           
            public MyControlThread(int tasks) {
                this.numTasks = tasks;
            }
           
            @Override
            public void run() {
                ExecutorService executor =  Executors.newSingleThreadExecutor();
                for (int i = 1; i <= numTasks; i++) {
                    Runnable worker = new MyTask("task" +i, 5);
                    executor.submit(worker);
                }
                executor.shutdown();
                while (!executor.isTerminated()) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    }
                }
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mDialog.dismiss();
                    }
                })
            }
        }
       
        private class MyTask implements Runnable {
            private int numLoops;
            private String nome;
           
            public MyTask(String nome, int loops) {
                this.nome = nome;
                numLoops = loops;
            }
           
            public void run() {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mDialog.setMessage("Processando " + nome);
                    }
                });            
               
                fazerAlgoDemorado();
               
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(TesteExecutorsActivity.this, "Fim da " + nome, Toast.LENGTH_SHORT).show();
                    }
                });
            }
           
            private void fazerAlgoDemorado() {
                int i = 0;
                do {
                    try {
                        Thread.sleep(1000)
                        i++;
                    } catch (InterruptedException e) { 
                    }
                } while (i<numLoops);
            
            }
        }
       
    }
 


main.xml

<?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>
 


Manifest file

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.agorandroid.testeexecutor"
    android:versionCode="1"
    android:versionName="1.0" >


    <uses-sdk android:minSdkVersion="7" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

        <activity
            android:name=".TesteExecutorActivity"
            android:label="@string/app_name" >

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
 



PS: Algumas considerações sobre o código:

No trecho abaixo, devemos observar o seguinte:
a. O executor é definido com uma thread para podermos executar as tarefas sequencialmente uma a uma.

                ExecutorService executor =  Executors.newSingleThreadExecutor();
                for (int i = 1; i <= numTasks; i++) {
                    Runnable worker = new MyTask("task" +i, 5);
                    executor.submit(worker);
                }
 

b. O loop for é para simular a submissão de "n" tarefas, normalmente teríamos diversas tarefas diferentes sendo submetidas da seguinte forma:

                    Runnable worker1 = new MyTask1("task1");
                    executor.submit(worker1);
                    Runnable worker2 = new MyTask2("task2");
                    executor.submit(worker2);
                    . . .        
                    Runnable workerN = new MyTaskN("taskN");
                    executor.submit(workerN);
 


PS1: Nas tarefas, o Handler é utilizado para executar algum código na UI Thread, normalmente para alterar a tela.

Publicado também no meu blog:
http://agorandroid.blogspot.com.br/2012 ... te-em.html

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


30 Abr 2012, 03:07
Perfil
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 1 Mensagem ] 

Quem está online

Usuários vendo este fórum: Adeja, albinoneto, alexandrefett, alexandrepom, Alexsandro Tirloni, alsimoes, Andre, ARAKINIDIO, arkanjo, Ask Jeeves, attomweb, Augusto, Biel, blurkness, bomcabelo, Bravox, BrunoO, btminzon, cabelo, canaville, Celso Jr., Chassot, compto, Corneta, Costa, craudiao, danilosv, Darth Sidious, Dassi, deborazb, Diego Otani, du_sr, edwarvelarde, eferrari, Everton Moreira, flaviolemos, Flávio Robertgo, fracon, fredjpa, geovanebg, Google Desktop, Gooooogle, gustavo, HanNiBaLSeTDf, hbarroco, helder, helder84, heliopassos, hugomarinho, jacksonst, jacquesbica, JAndroid, Javanês, jeanbr07, Jenius, JMurray, joaquimfoto, JRSIQUEIRA, juliaojunior, Juliobcosta, juliomar, jwv, klebersilvarocha, lalaine, leeeeooooooo, leoadias, leonardodamata, lfirpo, LForce, lucasmadeira, LucasNascimento, lucianno, luiz.lago, luizcesar, luizfilipe, Mace Windu, MarceloMC, marcosf63, maurofjr, maurosilva, MBetioli, mirelli, mmiottobarbosa, MSN NewsBlogs, Mvitor, nina.rm, Odigooogle™, PAMinhoto, paulabr, paulokiller, pedro, pemam.com.br, piagg, piantino, r.wil, Rainha Amidala/Padmé, ramonrabello, raulcca, reginaldo, rerp7, ricardoogliari, ricardzanella, rixargolo, robsonoracle, rodrigo_mg, romulotales, rotilho, samuel.cavanieri, Samuka, ScoobyGB, Teodoro, the_hulk_knifer, thienne, tiagofalcao, ton.soares, Vania, voliverio 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 - 2013 Portal Android - Comunidade de Desenvolvedores da Plataforma Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi