Esse artigo faz parte da revista Java Magazine edição 18. Clique aqui para ler todos os artigos desta edição

jm18_capa.jpg

= o ns = "urn:schemas-microsoft-com:office:office" />

Começando com o Java wireless

Hoje fala-se muito o termo wireless, mas este diz pouco sobre como uma aplicação sem-fio realmente deve ser. Independentemente de qual tecnologia estiver sendo utilizada, wireless significa mobilidade. De fato, o grande diferencial de uma solução móvel é permitir que seus usuários obtenham qualquer tipo de informação, em movimento. Especialmente se você mora em uma cidade grande, como São Paulo ou Rio de Janeiro, e está sujeito a encontrar grandes congestionamentos, a vantagem é enorme. A possibilidade de ver a situação de vendas ou o status dos servidores, de responder um e-mail urgente vindo do outro lado do mundo, isso tudo no meio de um congestionamento quilométrico (ou em outra situação similar), permite interagir mais e mais com o trabalho, mesmo longe do escritório.

Tal vantagem pode até parecer óbvia, mas acredito que ainda estamos longe de compreender o impacto das mudanças trazidos pelo uso de aplicações móveis em larga escala. Tanto que alguns economistas propõem que nos encontramos à beira de uma revolução na era da informação – a Economia Livre. Você não mais acessa a informação dentro de um ambiente determinado, como sua casa, escritório, escola, Internet Café. O acesso à informação torna-se livre e independente de localização.

Se você não quer “perder o bonde”, então sugiro que comece agora a pensar em desenvolver soluções móveis. Mas lembre-se: isso não significa apenas começar novos projetos com "wireless" estampado nos documentos de requisitos. Você pode estender uma solução convencional, parcialmente pronta, adicionando módulos móveis. Imagine o seu sistema simples (mas crítico) de gerenciamento de contatos via web, agregado de funcionalidades de mobilidade que permitam ao usuário acessá-lo também através do celular ou PDA.

Porém, mesmo que você seja um desenvolvedor experiente, entrar nessa onda implica em pensar em questões às quais talvez esteja pouco acostumado.

Escassez e J2ME

É interessante perceber o impacto que a escassez pode gerar em todos nós. Por exemplo, antes da crise do petróleo, na década de 70, a gasolina era abundante e barata. Construíam-se carros enormes capazes de cortar os Estados Unidos de ponta a ponta, com consumo na casa de 5 quilômetros por litro – e ninguém realmente estava preocupado com a eficiência do motor, ou mesmo com a qualidade da gasolina, algo desnecessário diante de tanta abundância. Mas quando o petróleo encareceu, muita coisa começou a mudar. Até os pequenos passeios começaram a sair muito caro, e parecia que tudo iria parar e nada mais seria divertido como antes.

Fico imaginando o que aconteceria aos profissionais de informática de hoje se de repente surgisse uma lei internacional que taxasse o uso da internet por byte trafegado. Além dos previsíveis protestos de geeks e ataques a websites de empresas, uma conseqüência seria a procura por maior eficiência nos aplicativos, principalmente na utilização da rede.

Freqüentemente, deparo-me com profissionais Java que gostariam de ingressar no desenvolvimento de aplicações J2ME. O maior problema ao envolver-se com essa tecnologia, principalmente quando se vem do desenvolvimento em J2SE e J2EE, é achar que os recursos são abundantes como nestas áreas. Considerar que a rede sempre está disponível com alta velocidade e baixo custo, que a memória do dispositivo é vasta, que a tela é espaçosa e o poder de processamento é equivalente ao de um Centrino... Ilusão!

Aparelhos e comunicação

Ao decidir por criar uma solução móvel, comece fazendo uma pesquisa de mercado e avalie as tecnologias disponíveis na sua cidade ou região. Tente evitar qualquer tipo de solução que deva ser importada, para que não haja problemas com peças de reposição e suporte técnico.

Quanto a equipamentos, temos no mercado brasileiro alguns palmtops (PDAs), uma quantidade razoável de coletores de dados proprietários e uma variedade enorme de telefones celulares poderosos, oferecidos pelas operadoras de telefonia (veja o quadro "J2ME no Brasil").  

Tecnologias de aplicações

Qual é a melhor tecnologia? J2ME? SMS? MMS? Brew? Na verdade, todas têm suas vantagens e desvantagens (e não são mutuamente excludentes). Contudo, posso dizer com muita segurança que a tecnologia J2ME oferece a melhor relação custo/benefício por vários motivos:

1.    Se na empresa houver profissionais capazes de desenvolver em Java, eles poderão ser reaproveitados no desenvolvimento de soluções móveis. Isso é praticamente impossível se for adotada outra tecnologia.

2.    A enorme adoção de J2ME por fabricantes de celulares e operadoras permite que sua aplicação móvel seja capaz de rodar em uma ampla variedade de aparelhos, muitos já disponíveis no mercado brasileiro.

3.    Uma vez que a aplicação é instalada no aparelho, será possível executar a aplicação mesmo em áreas onde a operadora não ofereça cobertura. Uma vez que você retornar à área de cobertura, poderá ser estabelecida uma nova conexão, e enviados os dados pendentes.

Online ou offline?

Com tudo isso, lembre-se que nem todas as aplicações, apesar dos modismos, precisam ser on-line. Qualquer solução que envolva a obtenção de dados em tempo real, "pelo ar", exige uma forte infra-estrutura. Dessa forma, ou você adota uma infra-estrutura de alguma operadora e paga pelos custos dos dados trafegados, ou terá você mesmo que montar sua própria "infra" para envio dos dados (isso pode ser um problema, porque fatores como a dimensão da área a ser coberta e equipamentos de instalação, além de possibilidade da ocorrência de áreas de sombra, podem elevar desmasiadamente os custos da solução).

Outra tecnologia que vale conhecer de perto é a Bluetooth, que está agora deslanchando pra valer. Dois dispositivos quaisquer dotados dessa tecnologia – muitos celulares já vêm com Bluetooth embutido – podem trocar dados entre si com facilidade. Isso traz um leque de possibilidades para as soluções móveis, e permite realizar transmissões simplesmente aproximando seu aparelho de outro. Você até poderia fazer um peer-to-peer entre os dispositivos e eliminar a necessidade de qualquer tipo de infra-estrutura wireless.... mas isso seria um assunto para outro artigo.

Na minha visão, a utilização do Bluetooth irá nos permitir o desenvolvimento de soluções intermediárias, que possam ser parte offline, parte online. Como não existe a necessidade de adquirir cabos, então o tempo de uso dos aparelhos será muito maior. Se você conseguir colocar na mesa os custos envolvidos com aparelhos, acessórios e tráfego de dados, e eles forem de acordo com seu orçamento, então uma solução online será ideal: ela irá permitir avaliar o que está acontecendo fora da sua empresa ou casa todo o tempo, e ainda assim integrar com toda infra-estrutura de servidores existentes. Isso irá transformar a sua aplicação móvel em mais um “braço” de todo o sistema. Mas, como vimos, deve-se ter cuidado ao pressupor que toda solução online é necessariamente melhor que uma offline. Pondere cuidadosamente os custos envolvidos, principalmente aqueles relacionados ao tráfego de dados, antes de fazer uma decisão final para seu projeto.

O mercado e a onda

O número de brasileiros capazes de adquirirem um telefone celular é muito maior do que o dos que podem comprar um computador pessoal. É imenso o mercado a ser atingido pelos desenvolvedores de soluções móveis. Convido a você a embarcar nessa onda sem-fio, e a começar a desenvolver soluções acessíveis de qualquer lugar, utilizando a tecnologia J2ME.

 

Gerenciando a escassez

Para se tornar um bom profissional J2ME, você precisa mudar uma série de conceitos. Veja algumas dicas úteis para quando decidir entrar nessa área de desenvolvimento.

Onde fazer o processamento

Tente evitar realizar processamento intensivo no dispositivo. Deixe as tarefas que necessitam de mais recursos computacionais para o servidor e envie ao dispositivo apenas os resultados. A idéia é reduzir o tempo de resposta. Lembre-se que um usuário de aplicações J2ME geralmente tem menos paciência – afinal ele pode estar caminhando ou dirigindo enquanto usa sua aplicação. Definir o que o servidor e o dispositivo devem fazer não é uma tarefa simples e depende, é claro, do aplicativo. Mas, muitas vezes, usar o bom senso será suficiente. Um exemplo simples é fazer no servidor a ordenação de listas a serem visualizadas no aplicativo.

A tecnologia J2ME permite fazer esse tipo de decisão de forma a maximizar o uso do servidor, pois o dispositivo ganha um grau maior de “inteligência” (com outras tecnologias como SMS ou WAP isso não seria possível). Entretanto ao fazer o processamento no servidor, conseqüentemente, utilizando uma linha de comunicação da operadora, lembre-se de considerar os custos de comunicação envolvidos.

Simplicidade

Desenvolver aplicações fáceis de usar não é simples, principalmente se a lógica da aplicação exige que vários passos sejam feitos até se chegar ao resultado esperado. Entretanto, a tarefa é facilitada se você resolver tais questões durante a especificação e o projeto (design). Uma das formas mais eficazes de simplificar um aplicativo é retirar funcionalidades raramente utilizadas – sempre considere cada funcionalidade de forma cuidadosa antes de acrescentá-la. Caso seja necessário adicionar um recurso utilizado esporadicamente, considere colocá-lo numa aplicação à parte. MIDlets permitem o compartilhamento de dados no dispositivo de forma eficiente.

Uma vez que as funcionalidades desnecessárias tenham sido retiradas ou deixadas para uma segunda aplicação, dê uma boa olhada na interface com o usuário. Grande parte da aplicação é gasta trabalhando com telas, até se conseguir chegar ao resultado final. Procure reutilizar a mesma tela sempre que possível – isso não apenas reduz o tamanho da aplicação, como também facilita o aprendizado do usuário. Tente também projetar ações simples para cada funcionalidade, além de maneiras consistentes para acionar comandos na aplicação, e agrupe as funcionalidades mais utilizadas para que fiquem rapidamente acessíveis pressionando-se poucos botões. Mas, ao buscar essa simplificação, não se esqueça que você terá muitos tipos de usuários – não deixe de incluir funcionalidades para os usuários avançados “fuçadores”.

Otimizando o uso de memória

Como vimos, a quantidade de memória disponível nos dispositivos J2ME é bastante limitada. Seguem-se algumas dicas de como evitar o desperdício desse recurso.

Prefira tipos primitivos

O impacto da alocação de objetos no desempenho e na quantidade de memória consumida é especialmente significativo em aplicações J2ME. Para reduzir o número de objetos alocados, tente utilizar tipos primitivos sempre que possível. Por exemplo, considere estes métodos de uma classe hipotética para definir o tamanho de um componente:

 

public void setSize(int largura, int altura);

public void setSize(Dimension tamanho);

 

A primeira variação utiliza somente tipos primitivos; a segunda faz uso de um objeto, que deverá ser alocado antes. A primeira tem mais código, mas reduz a alocação de objetos, portanto seria mais adequada para aplicações J2ME.

Ajude o Garbage Collector

Embora o Garbage Collector (GC) tenha um papel essencial em Java, ele pode ser o “calcanhar-de-Aquiles” em aplicações J2ME. Quando se alocam muitos objetos rapidamente, o GC pode ter problemas para liberar objetos. Sua aplicação pode até ficar “congelada” por alguns instantes para que o coletor consiga fazer todo o seu trabalho.

Uma forma de agilizar a “limpeza” é sempre atribuir null a referências de objetos, sempre que tiver certeza que os objetos não serão mais utilizados. Por exemplo, você poderia definir um método finalizar(), dessa maneira:

 

public class MinhaClasse {

  private Object meuObjeto;

 

  public MinhaClasse(Object obj) {  meuObjeto = obj; }

  public void finalizar() {  meuObjeto = null;  }

}

 

Atribuindo um valor nulo às referências, você agiliza a coleta de lixo. E é uma técnica simples, que requer pouco código adicional.

Faça instanciamento preguiçoso

Outra técnica para reduzir picos de uso de memória é instanciar objetos apenas imediatamente antes de utilizá-los. Esta técnica é chamada de lazy instantiation ("instanciamento preguiçoso").

Primeiro é verificado se a referência do objeto é nula; caso positivo é criada uma nova instância. Veja um exemplo:

 

public class ClassePreguicosa {

  private Vector v;

 

  public Vector getVector()  {

    if(v == null) v = new Vector();

    return v;

  }

}

Reutilize objetos

Uma das melhores técnicas a utilizar em qualquer aplicação Java é alocar objetos e depois reutilizá-los para uso futuro. Criamos classes com métodos de inicialização e finalização, e fazemos o cache de objetos não mais utilizados. Por exemplo, considere a seguinte classe:

 

public class Exemplo {

  private Object valor;

 

  public Exemplo(Object v) { inicializa(v); }

  public Object getValor() { return valor; }

  public void inicializa(Object v) {  valor = v;  }

  public void finaliza() { valor = null; }

}

 

Assim, você garante uma reutilização da própria classe que estiver utilizando, e ainda ajuda o Garbage Collector.

Exceções com parcimônia

O uso de exceções tende a deixar o código mais limpo e é muito recomendado, mas em J2ME o recurso merece atenção especial, pois o levantamento de exceções aumenta a alocação de objetos. Tente usar outras maneiras que não exceções para lidar com erros comuns (ou previsíveis) que surgem durante a execução.

 

Links

archive.devx.com/wireless/articles/rb0501/rb0501-1.asp

Designing Effective User Interfaces for Wireless Devices

j2medeveloper.com/j2mebook/Chapter3.pdf

TEXT-INDENT: 0cm; TEXT-ALIGN: left; tab-stops: 411.1pt 20.0cm" align=left>MIDP 1.0

WMA 1.0

MMAPI 1.0

JavaPhone 1.0

PersonalJava 1.1.1

MIDP 2.0

Claro

...
Quer ler esse conteúdo completo? Tenha acesso completo