Concorrência em Android

21
Concorrência em Android Por Pedro Veloso [email protected] Google + : http://goo.gl/yS2sE

Transcript of Concorrência em Android

Page 1: Concorrência em Android

Concorrência emAndroid

Por Pedro [email protected]

Google + : http://goo.gl/yS2sE

Page 2: Concorrência em Android

Concorrência

“Concorrência ocorre quando existem dois processos executados em simultâneo; mais especificamente, o termo é utilizado quando esses dois processos disputam o acesso a recursos partilhados.”

Fonte: Wikipédia :P

Page 3: Concorrência em Android

Multi-Threading

Uma Thread é uma pequena unidade de processamento que corre como sendo parte de um processo mas concorrente ao processamento principal deste.Vantagens do seu uso :

• Assíncronia• Não bloqueantes• Aceleração de Processamento• …

Page 4: Concorrência em Android

Para que é que isto me serve?!

• Evitar ANR!• Ser um bom cidadão– O dispositivo é do

utilizador, não do programador!

• Fazer aplicações ricas em usabilidade e interactividade

• …

Page 5: Concorrência em Android

Android“Debaixo do chassis”

• Bionic e Pthread (Baseado em partes de BSD, Linux e Jedi Mind Tricks)

• Live together – happy family :)• VM por Aplicação• Cada componente high-level é um processo

novo• Dentro de cada processo existem vários sub-

processos (Main UI Thread sendo o + importante)

Page 6: Concorrência em Android

Android é um freak das threads!

Page 7: Concorrência em Android

Show me moar !

• Multi-threading pode assumir várias formas:– Services– IntentService (Service com super

poderes)– AsyncTask– Handlers + Good old Threads– Daemon Threads

Page 8: Concorrência em Android

Services

• Correm em plano de fundo• Têm o mesmo tipo de callbacks e

lifecycle semelhante a uma Activity• Útil para acções prolongadas e que

devem (podem) exceder o tempo de vida de uma Activity

Page 9: Concorrência em Android

IntentService

• Derivação especial de Service, que a cada novo Intent cria uma worker thread para execução

• Pedidos são processados em formato Queue (para os esquecidos – FIFO)

• Pára automaticamente quando já não tem mais pedidos a processar

• Útil para quando existe necessidade de executar várias tarefas fora da Activity em que a abstracção de Queue faça sentido

Page 10: Concorrência em Android

AsyncTask

• Class única de Android que permite abstrair a complexidade de trabalhar com Threads

• Tem de ser invocada a partir da Main UI Thread directamente

• A tarefa só executa uma vez (mas podemos encadear execuções separadas em série)

Page 11: Concorrência em Android

AsyncTask – Exemplo Prático

Page 12: Concorrência em Android

AsyncTasks

• Uma instância de AsyncTask apenas pode ser criada na Thread UI principal

• Uma tarefa pode ser lançada desta forma: new [NomeDaClass AsyncTask].execute( [parâmetros] )

• A tarefa pode ser cancelada com o método cancel() , o qual chamará o callback onCancelled(Object) (doInBackground vai correr na mesma)

Page 13: Concorrência em Android

Threads!(Class)

Page 14: Concorrência em Android

Workflow Threads

Page 15: Concorrência em Android

Devia existir uma forma de lidar com este workflow

automaticamente! A Google não presta!

É por isso que Android blablabla…

Page 16: Concorrência em Android

Daemon Threads!

• reproMusica.setDaemon(True)

• A Thread é automaticamente parada assim que a Thread principal da aplicação morre

• Deve-se fazer esta declaração antes do método start()

Page 17: Concorrência em Android

Threads e MainUI ThreadEntra o Handler!

• Em Android a forma típica de comunicação entre Threads é feita recorrendo à classe Handler

• Geralmente mantêm-se a scope dum objeto deste tipo a nível Global, e enviam-se mensagem para o mesmo, as quais são processadas respeitando a ordem da Queue

• Cada Handler está associado a uma única Thread, e essa Thread rege-se pela Queue definida

• No onStop() deve-se limpar a Queue do Handler manualmente!

Page 18: Concorrência em Android
Page 19: Concorrência em Android

Handlers, Handlers, Handlers…

• sendEmptyMessageDelayed(int what, long delayMillis)

• sendMessageAtFrontOfQueue(Message msg)

• sendMessageAtTime(Message msg, long uptimeMillis)

• post(Runnable r) : Um runnable é adicionado à queue

• postDelayed(Runnable r, long delayMillis)

Page 20: Concorrência em Android

HandlerPost-Runnable Exemplo

Pontos a reter:• Handlers são Single Threaded• Particularmente úteis para tarefas de inicialização, onde a estrutura de Queue faz sentido• Forma prática de comunicar com a UI Thread

Page 21: Concorrência em Android

THEEND