Oopsie!

Então, parece que o WeightWatch não estava a arrancar hoje de manhã. Deu mais ou menos para perceber logo que era um problema com alguma função que tivesse a ver com as datas, visto que nos encontramos no último dia do mês, e isto dos erros de programação em intervalos de números contínuos costumam ser mais comuns nos limites desses intervalos.

Basta mudar a data do telemóvel andando um dia para trás para confirmar essa teoria — o programa a seguir já corre normalmente.

Primeiro uma pequena explicação sobre como funciona a geração de gráficos. Quando o programa começa, vai buscar a data actual e cria um gráfico para o mês actual. A seguir, o programa subtrai um mês à data actual para criar o gráfico do mês anterior, e adiciona um mês para criar o gráfico do mês seguinte. Assim, quando é preciso mostrar o gráfico do mês ao lado, a imagem já está criada, e, durante os 250 milissegundos que dura a animação da mudança de mês, o programa aproveita para ir gerando o gráfico seguinte de maneira a ter sempre 3 gráficos em memória: o que aparece no ecrã, o anterior e o seguinte.

Ora, o problema que o programa tinha era de que quando é preciso subtrair ou aumentar um mês, estava simplesmente a dizer à biblioteca de datas do Java para me criar uma data nova em que se subtraía ou somava um mês ao mês actual:

calendar.set(Calendar.MONTH, month - 1);

O problema é que a biblioteca do Java não verifica se o dia é válido para o novo mês, como eu pensei que fizesse. Em vez disso, se o dia não for válido, a biblioteca não consegue gerar uma data válida e falha violentamente.

A solução foi simples. Como não precisamos do dia para nada quando estamos a mudar o mês (só interessa o mês), podemos mudar primeiro o dia para um valor inócuo:

calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.MONTH, month - 1);

Et voila! Já funciona de novo.

O novo executável já se encontra online no sítio do costume. A alternativa é mudar a data do telemóvel temporariamente e iniciar o programa para então fazer uma actualização online.

Como vantagem, a nova compilação já inclui as correcções que tenho estado a fazer ao programa durante os últimos dias, pelo que para além de já não ter este bug horrível, o programa deve funcionar melhor em geral.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>