De que se trata o artigo:

Neste artigo abordaremos algumas formas de utilização de nultithreading em duas das principais plataformas móveis existentes no mercado: Android e IOS. Apesar da diferença nas suas APIs e linguagens de programação, o fundamento de concorrência é semelhante em ambas e tem base em conceitos comuns e bastante fundamentais dos sistemas operacionais.

Em que situação o tema útil:

Este artigo é útil para aqueles que tenham interesse em conhecer aspectos avançados de desenvolvimento para dispositivos móveis considerando as plataformas Android e IOS.

Resumo DevMan

Devido às peculiaridades e complexidade da programação utilizando concorrência, é altamente recomendado que a sua utilização seja planejada desde o principio, definindo-se claramente quais áreas e rotinas da aplicação deverão rodar de forma assíncrona. Neste contexto, neste artigo abordaremos algumas formas de utilização deste assunto em duas das principais plataformas móveis existentes no mercado: Android e IOS.

Com a popularização das plataformas móveis, cada vez mais desenvolvedores tem se aventurado a criar novas e interessantes aplicações para smartphones e tablets. Aplicações móveis precisam ser responsivas aos comandos dos usuários, mantendo-se fluidas nas trocas de tela ou durante a interação do usuário com seus componentes de interface. Fazer com que aplicações se comportem desta forma é especialmente difícil se você desenvolve soluções móveis do tipo cliente-servidor, nas quais operações demoradas como download de dados Internet e rotinas locais de IO (como ler ou gravar arquivos) são frequentemente executadas.

Se implementadas de forma incorreta, operações de IO podem facilmente travar a UI da aplicação até que sua execução seja finalizada, prejudicando a experiência do usuário final e potencialmente danificando a imagem da sua aplicação. Para casos como este, o uso de operações assíncronas e threads podem ser utilizados a fim de permitir que rotinas possam ser executadas enquanto a aplicação estiver interagindo com o usuário. Para tratar deste assunto, este artigo demonstrará algumas técnicas de desenvolvimento baseados em programação concorrente.

Por concorrência podemos entender a capacidade de uma aplicação em executar simultaneamente diversas operações (como baixar arquivos, executar musicas, acessar sistema de arquivos) e, acima de tudo, sem que a aplicação congele ou trave por determinados períodos de tempo. Além disso, o uso de concorrência permite ganho de performance da sua aplicação eventualmente tirando proveito de sistemas com processadores multi-core - cada vez mais presentes nos dispositivos móveis - onde diversas rotinas poderão ser executadas em paralelo pelos diversos núcleos do processador (ler Nota DevMan 1).

Nota DevMan 1. Processadores

Em processadores de núcleo único, rotinas assíncronas são executadas por TDM (Time Division Multiplexing). O processador alterna seus contextos de execução entre os diversos threads ativos em frequência tamanha a dar impressão ao usuário de que os threads estão sendo executados simultaneamente.

Devido às peculiaridades e complexidade da programação utilizando concorrência, é altamente recomendado que a sua utilização seja planejada desde o principio, definindo-se claramente quais áreas e rotinas da aplicação deverão rodar de forma assíncrona. Converter uma aplicação existente para suportar concorrência é consideravelmente mais difícil e pode levar a falhas de execução indesejadas.

Neste artigo, abordaremos algumas formas de utilização deste assunto em duas das principais plataformas móveis existentes no mercado: Android e IOS. Apesar da diferença nas suas APIs e linguagens de programação, o fundamento de concorrência é semelhante em ambas e tem base em conceitos comuns e bastante fundamentais dos sistemas operacionais: Processos e Threads.

Processos e Threads

Definiremos Processos como unidades independentes de execução gerenciadas pelo sistema operacional. Processos possuem seu próprio espaço de endereçamento de memória e se comunicam com outros processos apenas por métodos intermediados pelo sistema operacional, conhecidos como IPC (Inter-process Communication). Threads, por sua vez, são pequenas unidades de execução (podemos chamar de tarefas) que são executadas dentro de um processo onde sua área de memória é compartilhada entre outros Threads do mesmo processo, permitindo a comunicação entre si.

No momento em que uma aplicação é inicializada, o sistema operacional se encarrega de criar um processo responsável por gerenciar seu estado e sua área de memória. No caso das plataformas IOS e Android, logo após inicializado, o processo criará o primeiro Thread da aplicação, comumente denominado de Main Thread (conhecido também como UI Thread), que será responsável pelo Loop de eventos e atualização dos seus componentes de UI. Dessa forma, toda lógica executada daí em diante será inicializada a partir do Main Thread recém criado. Caso nenhuma lógica para concorrência seja utilizada nesta aplicação, poderemos apelida-la de Single Threaded Application (aplicação de thread único).

Papel do Main Thread

O Thread Principal é o encarregado de atualizar a UI da aplicação na forma de um Loop infinito, ouvindo eventos de toque e entrada de dados e redesenhando os componentes de interface quando necessário. Dessa forma, qualquer rotina iniciada dentro do Thread principal bloqueará as atualizações da interface até que sua execução seja finalizada, permitindo que o Loop principal volte a executar. Se a rotina em questão se prolongar, terminará por congelar a interface. Na plataforma Android, caso a aplicação congele por 5 segundos, o sistema mostrará a caixa de diálogo ANR (Application Not Responding), dando a opção ao usuário de forçar a finalização da aplicação.

...
Quer ler esse conteúdo completo? Tenha acesso completo