O documento discute os conceitos de concorrência e multi-threading no Android, incluindo como threads, serviços, AsyncTasks e Handlers permitem que aplicativos executem tarefas de forma assíncrona para evitar problemas de desempenho e fornecer uma melhor experiência ao usuário.
Concorrência em Android: Threads, Handlers, Services e AsyncTasks
1. Concorrência em
Android
Por Pedro Veloso
pedro.n.veloso@gmail.com
Google + : http://goo.gl/yS2sE
2. 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
3. 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
•…
4. 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
• …
5. 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)
7. Show me moar !
• Multi-threading pode assumir várias formas:
– Services
– IntentService (Service com super poderes)
– AsyncTask
– Handlers + Good old Threads
– Daemon Threads
8. 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
9. 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
10. 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)
12. 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)
17. Threads e MainUI Thread
Entra 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!
18.
19. 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)
20. Handler
Post-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