|
Página 1 de 1
|
[ 1 Mensagem ] |
|
[Mini Tuto] Executando tarefas sequencialmente em Thread
| Autor |
Mensagem |
|
A H Gusukuma
Dalvik Virtual Machine
Data de registro: 17 Jul 2011, 10:55 Mensagens: 1988 Localização: São Paulo
|
 [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 |
|
|
|
Página 1 de 1
|
[ 1 Mensagem ] |
|
Quem está online |
Usuários vendo este fórum: adautox, aechiara, alansousa, Alessandro Tavares, alexandre, alexandreizumi, aluclinux, andepunk, andre.hebeler, apoena, arkanjo, attomweb, Avelino Mateus Neto, Berbert, Bitor, bomcabelo, Bravox, BrunoO, BTalhadas, buccalon, caliow, Carlos, Catapan, cenatech, cleiton_maciel, comolatti, cosmotheoro, Deiapinh, diegorrborges, diogeneskelsen, dobau, dr.faro, Dudi_FC, e-azuos, edwarvelarde, Eliezer Reis, eluttner, Emanuella, Eneias, fabielp, Felipe, fernando neves, fgalvão, flaviolemos, Flávio Robertgo, Gabriel Laet, gabrielatme, Geire Robson Gadelha, glmsistemas, grandebaro, guitarro17, heliopassos, hellbest, humberto, icarodavi, ICCrawler - ICjobs, igor_meneguzzo, IgorBrum, inesfg, jairodealmeida, Javanês, jhhm_2008, joaquimfoto, jorgecardoso, Josinhaz, Juliane Silva, juliherms, Julio Assis, juliomar, Juninhooooo, JuniorE, klassmann, klebersilvarocha, kusanaguy, leoadias, levita, lfalcao, lfirpo, lkunta, LucasNascimento, lucianoalves, Lucious, luizcesar, Lúcio Zanette, Mace Windu, mam_computer, MARCIOHG, marinho5, martins, Matheus562, mmiottobarbosa, mvoto, nardosnt, neimarguerra, Nice, nina.rm, nullPointer, Paulo Bizzo, pererinha, pgbatera, phfmendes, pmzara, polonia, pomarolli, Rafael, rafaelmonoh, Rainha Amidala/Padmé, Ranieri, raragao, raulcca, rayberg, reginaldo, regis.ror, renata, rfrafa, ricardo_listadelphi, ricardoogliari, rlecheta, roberto caceres, robsonoracle, rodrigo_mg, rogerio, rogeriokta, ronanPlus, samuel.cavanieri, SEO Crawler, sephct, shibutani, silvio.carlos, sjta, skcratch, Snappy [Bot], snonca, Synoo [Bot], tChAnDy, the_hulk_knifer, thiago@xbrain.com.br, Thitto, Toks, Topeca, vaniuz, Vector, W3 [Sitesearch], wagner_francisco, Wds, Wendel Carvalho, wingdoido, xa:=zin, yuri82, zenden1503, zorba 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
|
|