quarta-feira, 25 de fevereiro de 2015

Algoritmo de sort com bug, está no Java, Python e Android

  Um algoritmo de sort (TimSort) usado em Java, Python e no Android contém um bug. Foi descoberto por Stijn de Gouw e outros pesquisadores.
  Stijn de Gouw publicou detalhes no link abaixo. Lá contém o erro, as explicações e a correção.
  Eles usaram técnicas avançadas da ciência da computação chamadas como métodos formais.
  Se você já teve um java.lang.ArrayIndexOutOfBoundsException num sort, provavelmente foi esse bug.
  Vale uma leitura detalhada no post.

http://envisage-project.eu/proving-android-java-and-python-sorting-algorithm-is-broken-and-how-to-fix-it/

  Abraços

domingo, 22 de fevereiro de 2015

Cancelando uma AsyncTask

  Logo no início dos meus estudos testei a classe AsyncTask, vejo que é uma classe problemática para os desenvolvedores Android. Problema, no sentido de dificuldade de entendimento do seu funcionamento.
  Inclusive, o pessoal do Android ajudou um pouco nessa confusão. Quando foi disponibilizado, no Android 1.5 - Cupcake (API 3), a tarefa era executada em um única thread em background. Logo em seguida, nas versões 2.x (API 4 a 10) isso foi mudado para um pool de threads, permitindo que várias tarefas rodassem em paralelo. Para, voltar a executar sequencialmente, uma tarefa por vez, no Android 3.0 - Honeycomb (API 11). Isso para evitar erros de aplicativos causados por execução paralela. O problema não estava, evidentemente, na AsyncTask e sim em como as tarefas foram implementadas.
  Mas, isso é história. O objetivo desse post é retornar num exemplo que postei há muito tempo. Link abaixo. O objetivo é incluir uma forma de cancelar uma tarefa quando a activity entrar nos métodos onPause, onStop ou onDestroy. Escolher em qual (ou quais) método colocar o cancelamento vai depender de cada caso, no meu exemplo, coloco em todos.
  Para cancelar basta usar o método da AsyncTask cancel(true), na verdade, não é cancelado automaticamente, é solicitado um cancelamento. A tarefa em execução precisa ser passível de responder ao pedido de cancelamento. Na tarefa, o método isCancelled() é usado para checar se o cancelamento foi solicitado. É recomendado checar sempre antes de executar um processamento demorado.

  Segue o código que usei no post do link abaixo com as alterações:



  Faltou dizer que ao cancelar a AsyncTask, o método onPostExecute não será chamado, em seu lugar, o método onCancelled deve ser executado.

http://agorandroid.blogspot.com.br/2012/02/asynctask-e-progressdialog-ex04.html

 Abraços

sexta-feira, 20 de fevereiro de 2015

Android básico: Usando o onSaveInstanceState

  Em algumas situações o sistema pode encerrar sua activity, seja por falta de recursos ou por mudança de orientação da tela. Nesses casos, o método onSaveInstanceState é chamado para permitir ao programador salvar algum dado da activity. O método é chamado com uma referencia a um bundle, nele é que se deve salvar o(s) dado(s). Quando a activity for recriada esse bundle é passado para o onCreate e onRestoreInstanceState.

  Segue abaixo um esquema básico:

Salva o(s) dados(s):




Recupera o(s) dado(s), aqui:




Ou aqui:



  Os dados da tela são salvos e restaurados automaticamente, por isso é fundamental chamar o método no super.
  Lembrar que esse procedimento só deve ser usado para dados temporários (transitórios), pois são salvos em memória, correndo o risco de serem descartados.
  Em caso de dados importantes, ou na dúvida, salve-os de maneira persistente.

Abraços



Curso Android online

Este curso oferecido pelo Coursera é bem interessante:


Programação de aplicativos para dispositivos móveis com sistema Android: Part 1
Programação de aplicativos para dispositivos móveis com sistema Android: Part 2
O inglês do professor Adam Porter é bem fácil, compreensível.
É bom ter um nível intermediário de conhecimentos de programação Java e, apesar de não ser um pré-requisito, é interessante ter um nível introdutório em Android. Vai aproveitar mais.
Assisti todas as aulas da parte 1 e estou acompanhando a parte 2. 
Gostei, recomendo.
Abraços



terça-feira, 17 de fevereiro de 2015

Android básico: retornando dados de uma activity para outra.

 Um fato que acontece com frequencia é a necessidade de capturar o retorno de uma outra activity. Para isso temos que chamar a activity com um método específico, o startActivityForResult.
 Por exemplo, a ActivityA invoca a ActivityB com startActivityForResult e aguarda o retorno em onActivityResult. Na ActivityB o retorno é passado via uma Intent, posicionado via setResult. 

 Abaixo segue o esquema básico:

 Na activity chamadora, ActivityA:



 Na activity chamada, ActivityB:




 Abraços

segunda-feira, 16 de fevereiro de 2015

Android básico: a classe Bundle

 Classe Bundle:  Um mapa de chave/valor, onde chave é uma String e valor tipos primitivos ou objetos empacotáveis (Parcelable) e/ou serializáveis. Em outras palavras, é uma classe utilitária para armazenar/transportar dados, um container.

 Todo iniciante em programação Android, toma contato com essa classe logo no primeiro app:



 Se você tiver um material mais antigo, pode ser assim:



Além de estar no onCreate, o Bundle também está em outros métodos da activity, como em onSaveInstanceState, onRestoreInstanceState. Está também na classe Intent, como um atributo usado para passar/receber dados. Os métodos com "Extra" no nome.

 O formato geral para acessar é: getXxx.
 O formato geral para incluir é: putXxx.

Onde Xxx é o tipo do dado, getInt, putInt, getFloat, putFloat, getIntArray, putString, etc.


Abraços




sábado, 7 de fevereiro de 2015

Relembrando: As regras sagradas do Android

Postei essas regras faz um bom tempo, como continuam válidas vamos relembrar:

O Android tem duas regras sagradas:
1. Não bloqueie a UI Thread.
2. Não atualize a tela através de uma outra thread.
Ou seja, não faça nada demorado na UI Thread e só atualize a tela pela UI Thread.
Para isso temos os seguintes recursos para implementar um código que cumpra as regras acima:
1. Thread
2. Runnable
3. Handle
4. AsyncTask

Além dos recursos citados, em outro post fiz uma lista mais completa (link abaixo).

As regras sagradas do Android

Recursos para processamento assíncrono no Android

Abraços

segunda-feira, 2 de fevereiro de 2015

Impressões sobre a leitura do Livro Dominando o Android - Do Básico ao Avançado

Livro: "Dominando o Android - Do Básico ao Avançado"
Autor: Nelson Glauber
ISBN: 978-85-7522-412-0
Páginas: 792
Ano: 2015

Estou lendo o livro "Dominando o Android - Do Básico ao Avançado", devo ter lido mais de 300 páginas, então já dá para dar uma opinião.
O livro é bom, muito bem escrito. Recomendo, com uma ressalva: não é indicado para quem está iniciando o aprendizado no desenvolvimento Android com o livro. Ele tem vários tópicos interessantes, mas pela abordagem, creio que um iniciante vai ter alguma dificuldade de entendimento.
O ideal é que o leitor já tenha algum conhecimento básico e alguns projetos desenvolvidos. Aí, o livro vai ser melhor aproveitado.

Outro senão, faltou incluir o indice remissivo. Acho muito útil.

Mas, estou gostando.

Parabéns ao autor Nelson Glauber e para a editora Novatec pelo livro.

Abraços.