sábado, 29 de dezembro de 2012

Meus estudos


Dando uma revisada geral no Android.
Estou aproveitando o tempo maior disponível nos últimos dias e nos próximos para dar uma lida geral na documentação do Android.
Com isso também pretendo fazer um plano de estudos para os próximos meses.
Abraços

quarta-feira, 26 de dezembro de 2012

Arquitetura de uma aplicação Android


  Uma aplicação Android é baseada numa arquitetura de thread única, ou seja, todo componente é iniciado numa única thread, chamada de Main Thread ou UI Thread.
  Se você já desenvolver em ambientes com interfaces gráficas, deve lhe ser familiar.
  Essa arquitetura é conveniente devido aos fatos de que toda interação com o usuário e todo o tratamento de eventos serem confinados à uma única thread, então a UI Toolkit pode ser desenvolvida para não ser compartilhada por múltiplas threads, significando que não é thread-safe.
  Não sendo thread-safe, fica claro o motivo de não podermos manipular a tela através de outra thread.
  Por outro lado, qualquer operação de longa duração vai nos dar a sensação de que a aplicação "travou".
  Aí, se entende a necessidade de usarmos outras threads para processar essas tarefas longas ou potencialmente longas.
  Ao iniciarmos outras threads, a responsabilidade para sincronizar o ciclo de vida dessas threads com o ciclo de vida dos componentes é do programador.
  Daí a necessidade de compreendermos bem programação concorrente.

Abraços!

domingo, 23 de dezembro de 2012

Minhas leituras, cultura geral

Outra área de meu interesse, é o autoconhecimento.
Estou lendo o livro "Rápido e Devagar, duas formas de pensar" (do original: "Thinking, Fast and Slow"), escrito por Daniel Kahneman, premio Nobel de Economia em 2002.
O livro foca no funcionamento da nossa mente, como pensamos e como tomamos decisões.
Com ele, estou entendendo melhor a velha frase: "Errar é humano."!

Ainda não terminei de ler, mas, já dá para recomendar para quem se interessa pelo assunto.

Abraços!

Anatomia de uma aplicação Android


  Os componentes da aplicação são os blocos de construção elementares de uma aplicação Android. Para se construir um aplicação Android temos quatro componentes básicos disponíveis: Activity, Service, Broadcast Receiver e Content Provider.
  Cada componente tem uma função específica dentro de uma aplicação.
- Às activities são reservadas a interação com o usuário, através da tela. É recomendado que cada activity seja relacionada com uma única tela.
- Aos services são reservados a execução de tarefas de longa duração ou repetitivas que não demandem interação com o usuário.
- Aos content providers, a interação com dados centralizados para compartilhamento entre aplicações.
Os dados de uma aplicação Android são de acessos exclusivos à aplicação. O único meio de compartilhar esses dados é através do content provider.
- E, finalmente, os broadcasts receivers, são os componentes que respondem aos avisos de broadcasts. Os broadcasts são gerados por eventos do sistema operacional (BOOT_COMPLETED ou BATTERY_LOW) ou por eventos nas aplicações (PEDIDOS_RECEBIDOS).

  A combinação coerente desses componentes resulta em uma aplicação Android funcional.

terça-feira, 18 de dezembro de 2012

Olhar do especialista

  Você já viu um médico olhar para um paciente, fazer um diagnóstico e mandar fazer uns exames apenas para confirmar a suspeita inicial?
  E programador que olha um código e, imediatamente, descobre um erro que o próprio autor está gastando horas sem descobrir?
  Isso é uma característica do especialista. Se adquire com estudos, treinamentos e muita, muita prática.

Abraços

quinta-feira, 13 de dezembro de 2012

Dificuldades em aprender programação Android


 Tenho acompanhado vários iniciantes em programação Android e suas dificuldades. Eles se dividem em dois grupos: os que estão começando do zero e os que já conhecem pelo menos uma linguagem de programação.
 Mas as dificuldades se restringem a apenas uma categoria: falta de alguma competência necessária à atividade.
 Para ser um programador, a pessoa precisa possuir (ou desenvolver) algumas características:
-gostar de resolver problemas
-capacidade de pensamento lógico abstrato
-capacidade de planejamento
-conhecer lógica e lógica de programação
-conhecer a sintaxe e semântica de alguma linguagem de programação
-conhecer estrutura de dados
-conhecer banco de dados
-conhecer a linguagem SQL
-conhecer o equipamento em que o programa vai rodar
-saber pesquisar no Google
-etc
E algumas para o Android:
-conhecer programação Java
-conhecer programação orientada a objetos
-conhecer programação orientada a eventos
-conhecer programação concorrente
-conhecer a plataforma Android
 .conhecer a filosofia da plataforma (arquitetura)
 .conhecer os componentes básicos de uma aplicação (activities, services, broadcastReceivers e content providers)
 .conhecer os recursos existentes para implementar os componentes

 Para se programar Android, normalmente é requerido que o programador tenha essas características de imediato, ou seja, fica difícil para um iniciante.
 Por isso, eu sempre recomendo usar um livro como guia para o aprendizado.
 A falta de alguma competência se deve na maioria das vezes à pressa em iniciar algum projeto. O novato salta alguns tópicos e vai direto para a codificação.
 Aí, com certeza, vai encontrar diversos obstáculos. Que vão desde problemas com lógica, desconhecimento da linguagem Java, conceitos de classes e objetos, programação concorrente, etc. Ou seja, problemas de formação básica, que todo candidato a programador Android, já deveria ter superado, chegando aos problemas com a plataforma Android propriamente dita. Neste ponto, entram além dos novatos, os que já programam uma outra linguagem.
 Na grande maioria das vezes, o tempo gasto com problemas simples, supera em muito o tempo para adquirir o conhecimento necessário, se o aprendizado fosse planejado.
 A recomendação para melhorar o rendimento nessa fase varia de acordo com o perfil de cada pessoa, obviamente, mas pode ser resumida de uma maneira geral da seguinte forma: faça uma avaliação pessoal das suas necessidades de aprendizado e monte um plano de estudos.

Abraços

Dica: estudem códigos

Hoje, serei sucinto!
Aprendam a ler códigos.
Estudem códigos de terceiros.
Estraiam o máximo estudando códigos.
Aprendam a visualizar aplicações de uma técnica usada um um código em outras situações.
E, finalmente, lembrem-se do ditado: Para um bom programador, um código vale mais que mil palavras!


terça-feira, 11 de dezembro de 2012

Content Provider, usando

 Para usar o Content Provider MyLocationProvider definido no último post, vamos tomar como base a mesma aplicação que testamos em diversos posts anteriores.

 O app tem as seguintes características:

 1. A activity inicia lendo os dados existentes no Content Provider e os mostra numa ListView. Para isso usamos um ManagedQuery, como o cursor resultante da leitura será gerenciado, o ListView será atualizado automaticamente quando o Content Provider for alterado.
 Usamos um ListAdapter extendido de um CursorAdapter para tratar os dados do cursor.
 A leitura dos dados é feita com um Limit de 20 linhas para ficar mais rápido e exemplificar o uso da clausula no db. A ordem é decrescente de data. O último location gravado é o primeiro do ListView.
 No método onStart é iniciado o service para coleta dos dados dos Locations Providers.
 Temos tres botões:
 .Start - inicia a coleta de dados no service
 .Stop - para a coleta de dados no service
 .Clear DB - Deleta todos os registros existentes no Content Provider

 2. No service:
 .Uso da tecnica produtor/consumidor para gravar os dados através de uma worker thread.
 .Uso de uma BlockingQueue para passar os Locations da thread principal para o thread consumidora
 .A worker thread é iniciada no onBind e fica aguardando os Locations para gravar no Content Provider
 .Uso da tecnica de controle do encerramento de uma thread através do envio de um objeto indicativo de fim

 Vamos aos códigos:

 AndroidManifest.xml

main.xml


linhalista.xml


ListAdapter.java

MyLocationActivity.java

MyLocationService.java

Algumas observações finais:
 .Normalmente não gravamos todos os Locations recebidos, fazemos uma seleção dos mais precisos, por tempo, etc.
 .Ou, definimos critérios para os providers nos enviar somente os locations em conformidade com os mesmos.
 .O metodo ManagedQuery está deprecated a partir do API 11, Android 3.0.x
 .Foi substituído pelo CursorLoader
 .O acesso aos dados para o ListView está na UI Thread, se ficar muito demorado usar uma AsyncTask.
 .Não testei o método update

Vejam o resultado, no Xperia mini:





 Abraços







Content Provider, criando um

 Content Provider é uma interface genérica para acesso a dados no ambiente Android. Somente através do Content Provider é possível compartilhar dados entre aplicações. O acesso a um Content Provider é padronizado, e como sempre, acessar um Content Provider nativo ou um definido por você segue o mesmo formato, sem distinção.
 Acessamos um Content Provider por intermédio da classe cliente ContentResolver.

 Nesse teste, vamos implementar um Content Provider usando o SQLite como repositório de dados. Vamos fazer um Content Provider de localizações geográficas.
 O exemplo é baseado no sample NotePad. Então, toda semelhança não é mera coincidência!

 Como pretendemos acessar o Content Provider em múltiplas threads, estamos testando também o uso de uma trava de leitura-escrita para tornar os métodos de acesso ao Content Provider seguros em relação às threads.
 Devido ao fato de que esse banco de dados pode ficar muito grande, também implementaremos uma forma de acessar os dados usando a clausula "limit" do SQL.

 Vamos seguir os seguintes passos para criar nosso Content Provider:

 1. Criar uma classe contrato. Essa é uma classe com as constantes do Content Provider, como URIs, MIME types, nome das colunas da tabela, etc. Esta classe estabelece o contrato entre o Content Provider e as aplicações clientes.
 MyLocation.class

 2. Definição da base de dados
  Vamos extender a classe SQLiteOpenHelper e implementar os métodos onCreate e onUpgrade.

 3. Criando o Content Provider
  Além de implementar os métodos onCreate, query, insert, delete, update e getType vamos definir também uma instância da classe utilitária UriMatcher. O UriMatcher nos ajudará a manipular as URIs para identificar qual formato estamos tratando.
 Também vamos instanciar um trava ReentrantReadWriteLock. 

 Vejamos o código:

 MyLocationProvider.class

 4. Registrar o Content Provider no Manifest file.



Com a opção android:exported="false" estamos informando que esse Content Provider é privado à aplicação.

 Pronto!
 Estamos com o Content Provider criado, no próximo post veremos como usá-lo.

 Abraços!