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!

quinta-feira, 22 de novembro de 2012

Dica: Estudem Threads

Programação concorrente é de longe a área em que os programadores cometem mais erros.
Tenho o costume de ler códigos de terceiros. Para estudar, e aprender técnicas diferentes.
E quando se trata de concorrência, ninguém escapa imune. Desde os novatos aos mais experientes, cometem erros nessa área.
Tenho encontrado códigos inseguros, com problemas básicos de programação concorrente, até em livros!
O problema é que detectar os erros em testes é muito difícil, pois, os erros só aparecem em condições específicas, que não ocorrem a toda hora. Um erro em programação concorrente exige que várias condições ocorram ao mesmo tempo para se manifestar.
Se é difícil encontrar os erros testando, então como encontrá-los? Boa pergunta, não é?
A resposta é: Fazendo uma análise conceitual. Se o código não atende aos princípios de programação concorrente segura, então está comprometido: mais cedo ou mais tarde, vai dar problema!

Abraços!

Meus estudos

Ultimamente não tenho tido muito tempo para me dedicar aos estudos.
Os assuntos que estou interessado no momento são os que seguem:


Processamento concorrente
 No Android, usar Threads, não é uma opção. É obrigatório.
 Então continuo estudando programação concorrente em Java.

Persistência de Dados
 SqLite e ContentProvider
 Dois assuntos que estou tentando me aprofundar.
 Se alguém souber de algum material sobre acesso concorrente a DB no Android, agradeço indicações.

Abraços

terça-feira, 20 de novembro de 2012

Singleton 2

Neste post sobre Singleton testei um exemplo que não era thread-safe, ou seja, não era para ser utilizado em uma aplicação multi-thread.

Segue abaixo dois modelos para uso concorrente.








Devo lembrar aos que forem usar um Singleton, que os dados estão na memória, então são dados voláteis.
Tenho visto algumas discussões sobre "perda" de dados dos Singletons.
Isso ocorre, por exemplo, quando uma app fica em background e o Android encerrar a app em caso de necessidade.
Minha opinião sobre esse fato é que estão querendo mais do que o recurso pode oferecer! Afinal, se necessitam dos dados em qualquer situação, persistam os dados, nunca deixá-los ficar somente na memória.

Abraços



quinta-feira, 15 de novembro de 2012

Dica: Quando usar a AsyncTask?


 A classe AsyncTask foi desenvolvida com o propósito de facilitar a execução de tarefas em uma worker thread e manter atualizações na tela (antes, durante e após o processamento da worker thread).

 Mas ela tem restrições de uso?
 A resposta é: sim.

 Ela deve ser usada em situações em que o tempo de processamento de uma tarefa seja demorado o suficiente para exigir que seja executada em uma thread separada da UI thread e que não ultrapace alguns poucos segundos.

 Isso devido ao fato de que uma AsyncTask normalmente é chamada usando uma tela de "Aguarde..." e/ou com uma barra de progresso e os usuários típicos desses equipamentos não gostam de esperar...

 Se as tarefas forem muito mais demoradas que os poucos segundos suportáveis pelo usuário, use outros recursos tais como: Executor, ThreadPoolExecutor, FutureTask e, provavelmente, em um Service.

segunda-feira, 5 de novembro de 2012

Onde usar Threads, na Activity ou num Service?


No Android toda vez que você tiver uma tarefa potencialmente demorada a recomendação é que se use uma outra Thread para processá-la.
Para isso nós temos várias alternativas para escolher como fazer.
Podemos usar uma Thread diretamente, podemos usar uma AsyncTask, podemos usar um Service (com thread), etc.
Para escolher uma opção, temos que levar em conta alguns critérios técnicos*.
- O ciclo de vida da tarefa.
- A volatilidade das informações.
- A duração da tarefa

Tudo se resume entre escolher entre uma Thread na Activity ou num Service
   1. Se o ciclo de vida da tarefa for além do ciclo de vida da Activity, devemos escolher um Service (started)
      Se não, podemos escolher um Service (bounded), uma AsyncTask ou uma Thread.
   2. Se as informações tiverem sentido apenas durante o uso da Activity
      Se as informações deverão ser salvas em arquivo ou db
   3. A duração da tarefa, uma tarefa pode demorar segundos (ou menos), minutos ou horas!
      Para tarefas com duração de (poucos) segundos, podemos usar Thread ou AsyncTask diretamente na Activity, nos outros casos use um Service.

Mas cada caso é um caso! Então precisamos analisar cuidadosamente qual opção atende melhor a nossa situação específica.
Para finalizar, não devemos nos esquecer do tratamento do encerramento da nossa tarefa.
E a experiência nos diz que tudo que pode demorar, pode ser passível de cancelamento por parte do usuário ou do próprio sistema.
Mas isso é outro assunto...

* não estamos considerando aqui a quantidade de tarefas e a possibilidade de paralelização, quando um pool de threads poderia ser uma opção.

PS: Temos novas opções: usar threads em fragments: um exemplo neste post

domingo, 4 de novembro de 2012

Testando Executor no Android - 2

 Para aproveitar os aparelhos com CPUs de múltiplos núcleos, podemos usar um executor com mais de uma thread.
 Basta alterar o onStart do post anterior como abaixo.



 Um alerta: não se empolguem com o número de threads, muitas threads podem fazer o desempenho despencar!
 Outro alerta: não se esqueçam que estamos fazendo processamento concorrente, então construam classes thread-safe!


sábado, 3 de novembro de 2012

Testando Executor no Android

 Este exemplo é uma variação do post Executando tarefas sequencialmente em outra Thread
 Neste caso, eu deixo um executor em stand-by durante todo o ciclo visível de uma activity e sempre que desejo executar uma tarefa em outra thread basta enviar a tarefa para o executor.
 Cada tarefa é colocada numa fila de execução do executor, e como o executor tem apenas uma thread cada tarefa é executada sequencialmente na ordem de solicitação.
 Para processar uma tarefa neste executor basta fazer isso:
 Runnable worker = new MyTask("task" +i, 5); 
 executor.execute(worker); 
 Em MyTask, eu coloquei um handler.post(Runnable) no início e no fim com Toast´s de notificações e um ProgressBar.

 Para testar é interessante clicar no botão "Executar task" várias vezes seguidas rapidamente ou pausadamente e ver as tarefas sendo executadas.

 Vamos aos códigos:
 TesteExecutor2Activity.java

main.xml

terça-feira, 25 de setembro de 2012

O caminho para o sucesso

Características de pessoas vencedoras:

1. Paixão, faça por amor, não pelo dinheiro.

2. Trabalho, dedicação, suor, renúncia.

3. Estudo, qualifique-se, seja bom nisso.

4. Persistência, repetição, não desista.

5. Foco, uma coisa de cada vez.

6. Motivação, motive-se, cobre-se, tenha compromisso.

7. Idéias, seja curioso, ouça, veja, pergunte, disseque, resolva.

8. Colaboração, compartilhe, troque idéias, seja útil.


Adaptado de Richard Saint John


sexta-feira, 7 de setembro de 2012

Usando o Handler como Timer 2

Aproveitando o exemplo do post anterior, e fazendo umas alterações, temos um outro uso do Handler. Desta vez para controlar um loop, usando o postDelayed.



Um uso para essa técnica é para fazer checagens de tempo em tempo em alguma condição.



quarta-feira, 15 de agosto de 2012

Usando o Handler como Timer

Uns dos usos interessantes da classe Handler é para executar alguma tarefa depois de algum tempo.




No caso vai executar o método finish() depois de 30 segundos.
O uso mais comum dessa técnica é para fechar a activity de Splash e chamar a activity principal.




segunda-feira, 13 de agosto de 2012

Dica: Como analisar as mensagens de erros do LogCat

Vamos fazer um projetinho bem simples para conseguirmos os dados para análise.

main.xml


TesteLogcatActivity.class


Ao executarmos, teremos a seguinte tela:




E no LogCat (no Eclipse, perspectiva DDMS):





Procuramos pela frase: "Caused by:", no caso é um erro de ArithmeticException : divisão por zero.
E na linha seguinte temos a linha da activity que causou o erro: linha 17.

A linha 17 na Activity é: resultado = dividendo / divisor;
O divisor está zerado, então corrigimos a linha 15: divisor = 10;
Localizado e corrigido o erro temos a nova activity:

TesteLogcatActivity.class



Ao executar, teremos um novo erro.

O LogCat, agora está assim:







Novamente, procuramos pela frase: "Caused by:", no caso é um erro de NullPointerException.
Geralmente um objeto não inicializado.
E na linha seguinte temos a linha da activity que causou o erro: linha 18.

A linha 18 na Activity é: tv.setText("Resultado = " + resultado );
tv é o objeto que não foi devidamente endereçado. Fazemos isso com o findViewById.

Localizado e corrigido o erro temos a nova activity:


TesteLogcatActivity.class



A executarmos, finalmente teremos a tela:



É isso.
Espero que ajude.

Obs: Se não tiver o "Caused by:" procure a primeira linha no LocgCat que tenha referência ao seu package, e verifique a linha no modulo indicado.

sábado, 11 de agosto de 2012

Android, Dalvik, Threads, diferenças


Tenho feito alguns testes com processamento concorrente em Java.
Uns dos primeiros testes que se faz quando estudamos concorrência é o da visibilidade de uma variável modificada por duas threads.
Ou se usa sincronização ou uma variável volátil para que as threads tenham acesso ao valor mais atual da variável.
Curiosamente, nas versões Dalvik que tenho testado, o programa listado a seguir tem funcionado, quando uma versão equivalente (não Android) fica em loop no meu pc.

Testei nos seguintes aparelhos:
Celular: Sony XPERIA mini E10a Android 2.1
Tablet:  Sansung Galaxy GT-P6210 Android 3.2
Tablet:  Motorola XOOM MZ604 Android 4.0.4

Obs: A variável "stopRequested" que uso para controlar o loop deveria ser volatile ou ser acessado via synchronized.


TesteThread04Activity.java



main.xml




Se alguém obter um resultado diferente gostaria de tomar conhecimento. Por favor, poste qual é o aparelho e a versão do Android.
Obrigado.

PS: Apesar de funcionar na maioria das vezes, está comprometido: não tem garantia que vai funcionar sempre.




sábado, 4 de agosto de 2012

Web Service


O colega Alexandre Antunes, do Portal Android, escreveu uma série de excelentes artigos sobre Web Service. Os artigos foram publicados na área de "Artigos, Tutoriais e Dicas" do Portal Android.
Ele, gentilmente, permitiu que eu os publicasse aqui no blog.
Como os artigos são longos e tem vários comentários, dúvidas e esclarecimentos, vou colocar abaixo os links para os mesmos.

Web Service RESTful 1 [+Java+JSON+Code]
Web Service RESTful 2 [+Consumir+Android+Code]
Web Service RESTful 3 [+PgSQL+DAO+Business+Factory]

Antunes, eu e os leitores do blog estamos muito agradecidos pelo seu gesto e por compartilhar o seu conhecimento. Muito Obrigado! Tudo de bom!

sábado, 14 de julho de 2012

Dica: java.lang.NoClassDefFoundError


Se está tendo o erro java.lang.NoClassDefFoundError, ou algo relacionado, tente o seguinte:

1.No Eclipse entre em:

-> Project
-> Properties
-> Java build path
-> Order and export.

2.Selecione os jars.

3.De um clean no projeto

Se não resolver:
1. Retirar os ".jar"s do "build path"
2. Alterar a pasta "lib" para "libs",
3. Adicionar os ".jar"s no "build path".
4. De um clean no projeto

Minhas Leituras Java e Android


Tenho enfatizado sempre que um programador deve ler muito.
Verifiquei que esqueci de citar que precisa ler em inglês. No mínimo tem que ter o chamado inglês técnico para leitura.
Feito a ressalva, vamos ao que tenho lido no último ano:

1. Apostilas de Java da Caellum

2. Livro Google Android - Ricardo Lecheta
Nos primeiros meses de estudos sobre o Android, estudava dezenas de páginas desse livro todos os dias; de segunda a segunda.
Li e reli o livro.
Hoje acho que o livro merece uma revisão de conteúdo e atualizações. O SDK estava em 2.x e agora já estamos no 4.1 (Jelly Bean).

3. Livro Java concorrente na prática - Brian Goetz

4. Livro Effective Java - Joshua Bloch

5. Livro Google Android para Tablets - Ricardo Lecheta

6. Tutoriais da Oracle sobre Java

7. Site Android Developers

Tenho lido alguma coisa de outras fontes também, mas os principais estão aí em cima.

Abraços




Primeiro aniversário do blog


O blog está completando 1 ano hoje.
No post de abertura, disse que já se contava a leitura de centenas de páginas, agora posso dizer que são milhares!
Alguns estudos foram postados nesse ano de 2012.
Tenho recebido visitas de diversas partes do mundo, não sei se estão entendendo os meus posts.
Não tenho recebido muitos feedbacks.Gostaria que os leitores deixassem suas impressões sobre os mesmos. Se são claros, se são uteis, se ajudam, se não, etc...

De qualquer forma, renovo agora o que disse há um ano:

Seja muito bem vindo ao “Agorandroid”!



Abraços

sábado, 30 de junho de 2012

Dica: layout.out.xml

Esse erro ocorre quando você tenta rodar o app estando no editor do layout.xml.
Parece-me um bug no plugin do Android.

Mas a solução é fácil, siga os passos abaixo.


Para corrigir:
- Delete o layout.out.xml
- De um clean no projeto - vá na aba Project -> clean
- Rode o projeto como android application ou de Open num fonte java e rode a app


Para evitar esse problema sete o seguinte:
Na aba Window:
> Preferences
  > Run/Debug
    > Launching
      > Launch Operation
        Selecione em: "Always launch the previously launched application"

quarta-feira, 20 de junho de 2012

Nova versão do app 100Palpite?

Acabei de publicar no Google Play a nova versão do aplicativo 100Palpite?
Link no Play
As alterações são:
1- Inclusão de um banner para publicidade.
2- Número de dezenas por palpite. Antes só gerava palpites com 6 dezenas, agora pode-se escolher entre 6 e 15 dezenas.
3- Envio do arquivo exportado (para o SD card) por eMail ou bluetooth

Boa sorte!

terça-feira, 5 de junho de 2012

Programação Android, aprendendo direito.


  Bom, você já deu uma verificada como funciona a programação Android, talvez tenha seguido um ou outro tutorial, e decidiu investir seriamente em aprender como desenvolver aplicativos para o Android.
  Nesse ponto, estou considerando que o seu conhecimento, de programação em geral e da linguagem Java em particular, seja pelo menos intermediário.
  Também estou considerando que você não tem acesso a um curso de programação Android numa dessas escolas conceituadas de pelo menos umas 40 horas. Ou, se tiver, já tenha terminado.
  A pergunta a ser respondida é: qual o caminho a seguir?
  Eu, recomendo que você use um bom livro como guia nos próximos passos.
  Um livro que seja recomendado pela comunidade. Tem que ter o aval de programadores experientes.
  Neste ponto eu desaconselho (existe essa palavra?), não recomendo de jeito nenhum, tentar seguir o caminho mais tentador, por parecer mais barato, de seguir apostilas gratuítas, video-aulas, ou coisas do gênero. Inclusive tutoriais, a menos que seja oficial do Google, ou, seja recomendado pela comunidade experiente.
  E por que um livro é mais indicado? Porque um livro bem escrito foi pensado como uma sequencia de lições, graduadas para se aprender passo-a-passo, preparando uma base sólida de conhecimentos mínimos para se desenvolver alguns aplicativos que representem vários aspectos das diversas possibilidades do ambiente Android.
  Mas, os outros materiais não podem ter essa mesma função? Poder, pode. Mas, nem sempre. E, além disso, me responda você: qual seria o custo para você se aprender errado?
  Neste ponto você não tem como avaliar se o material é bom ou não. Vamos evitar muita decepção e tempo se evitarmos isso.
  Esses materiais devem ser usados como um complemento, como material de consulta, como exemplos de uso. E, também, para avaliar seu conhecimento, se descobrir falhas nos códigos. Também, para aprender outras tecnicas de programação.
  Você já deve estar se perguntando, ou pelo menos pensado, espera aí cara, você escreve tutoriais para quê? Eu respondo mais tarde, aguarde...
  Eu disse seguir um livro, mas se tiver mais algum(ns) para consultas seria interessante. Aí você vai achar que eu esteja de gozação. Não, não estou. O problema é que perfeição está longe do ser humano, então o tal livro base pode ser bom, mas perfeito, nunca! Pode ser superficial num ponto, ou, não abordar algum tópico importante.
  Aprenda a ler códigos. Estude códigos. Aprenda com códigos. Os samples devem ser consultados sempre!
  Se conhecer algum programador Android experiente que possa ser consultado seria excelente. Se não tiver, consulte foruns e o Google. Para a maioria das suas dúvidas você vai encontrar as respostas que foram respondidas para alguém que teve a mesma pergunta. Se não encontrar, pergunte você mesmo em algum forum.
  Agora, vamos tentar responder a questão dos tutoriais. Quando alguém se dá ao trabalho de escrever um tutorial, ele está tentando passar uma informação sobre algum aspecto do Android (vamos considerar apenas o Android). Significa que o autor do tutorial está focado num tópico. Muitas vezes está passando por cima de uma série de considerações, como boas práticas, consistência, inclusive segurança, etc. Está também direcionando o tutorial para um determinado público, considerando nível de conhecimento, experiência, etc. Então, o novato vai achar que tem um exemplo completo e acabado, quando o tutorial está tentando passar uma (boa) idéia a ser desenvolvida.
  Quando você estiver mais ou menos na metade do  livro, você pode e deve iniciar algum projeto para aplicar o aprendizado.
  Bons estudos!

Como ser um bom programador Android


Você quer ser um bom programador Android? Então desenvolva as seguintes características ao máximo:
Paixão por programação
Gostar muito de ler
Gostar de aprender
Curiosidade
Autodidata
Inteligência
Memória
Concentração
Paciência
Humildade
Ensinar
Gostar de desafios
Organização
Planejar
Projetar
Algoritmos
Estrutura de dados
Design Patterns
Boas Práticas
Conhecer os recursos da linguagem Java e as bibliotecas do Android
Preguiça
Impaciencia
Ego
Precisão
Cumpridor de prazos
disponibilidade de tempo
Flexibilidade
Desconfiometro
Dedicação e perseverança
Solucionador de problemas

Você precisa ter aquilo que chamo "Paixão por programação", amar programar. Então, programe, programe e programe.
Você precisa "Gostar muito de ler"  pois é preciso "Gostar de aprender", porquê tem uma imensa "Curiosidade" para conhecer detalhes e um pouco de tudo.
Ter sempre um livro ou artigo ou tutorial sendo lido, estudado, esmiuçado!
Precisa ser "Autodidata", pois não teria como pagar cursos para tudo. Aliás, nem existe curso para isso tudo. Então, ter uma razoável "Inteligência" e "Memória" são fundamentais.
Capacidade de "Concentração" e "Paciência".
Ter "Humildade" para aprender com os melhores e uma dose maior para aprender com os novatos. E reservar um tempo para "Ensinar", saiba que ensinar é uma maneira de aprender!
Ler códigos e soluções de terceiros.
"Gostar de desafios", novidades, novos problemas, isso é o seu oxigenio!
Ajuda muito ter 'Organização", saber "Planejar" e "Projetar".
Ter um conhecimento geral de processamento de dados é importante, conhecer "Algoritmos", "Estrutura de dados", "Design Patterns" e é claro conhecer e usar  as "Boas Práticas" de programação.
"Conhecer os recursos da linguagem Java e as bibliotecas do Android", profundamente. Classes, objetos, frameworks, threads, activities, services, broadcasts receivers, sqlite, views, screens, smartphones, tablets, nullpointerexceptions: esse é o seu mundo.
Você precisa de uma dose de "Preguiça", para fazer código que funcione o mais rápido possível, para fazer código fácil de ler para não ter que gastar tempo no futuro, que seja fácil de fazer manutenção, e principalmente fazer código reutilizável, afinal fazer código repetitivo é demais para um preguiçoso!
"Impaciência", não dá para ficar esperando as coisas acontecerem, antecipe-se. Prepare-se para o futuro.
"Ego", tem que ter orgulho do seu trabalho. tem que ser um modelo a ser seguido, não ter um código amaldiçoado! Imagine um reles estagiário criticando um trabalho seu? Nunca, jamais!
Você precisa desenvolver com "Precisão", o programa tem que funcionar 100%.
Você deve ser um "Cumpridor de prazos", para isso saber avaliar a quantidade de trabalho e a sua dificuldade é fundamental.
E o que falar da "disponibilidade de tempo"? Precisa aprender a administrar o tempo desde cedo. Senão, não vai dar para fazer tudo isso. E, acima de tudo, existe muita vida lá fora!
Tenha "Flexibilidade", pois, muitas coisas irão mudar durante o desenvolvimento.
"Desconfiometro", este é um aparelhinho que deve ter sempre bem calibrado. A sua solução é a melhor? É abrangente? É facilmente alteravel? Tem pontos fracos? É como um sexto sentido, que vai ajudar em situações onde é dificil antever ou prever, mas, com ele você vai antecipar um possível problema.
No fim, tudo se resumirá em "Dedicação e perseverança", 99% de transpiração e 1% de inspiração e talento! Não se engane, nada substitui o trabalho duro.
Aí, você vai ser considerado um "Solucionador de problemas", aquele cara que sempre encontra uma solução para os problemas mais dificeis!
Felicitações, você agora é um bom programador Android!