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