Concorrência em Android
-
Upload
pedro-veloso -
Category
Technology
-
view
306 -
download
2
Transcript of 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
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