concorrência em android

Post on 02-Aug-2015

307 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Concorrência emAndroid

Por Pedro Velosopedro.n.veloso@gmail.com

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

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

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• …

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

• …

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)

Android é um freak das threads!

Show me moar !

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

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

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

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

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)

AsyncTask – Exemplo Prático

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)

Threads!(Class)

Workflow Threads

Devia existir uma forma de lidar com este workflow

automaticamente! A Google não presta!

É por isso que Android blablabla…

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()

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!

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)

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

THEEND

top related