Por que eu devo ler este artigo:

A comunicação assíncrona permite a troca de dados entre aplicações sem que elas fiquem aguardando o retorno da requisição para dar prosseguimento a suas atividades. O uso destas estratégias é essencial no desenvolvimento de apps que possibilitem uma boa experiência de uso para o usuário.

Uma tarefa comum nos aplicativos modernos é a intensa troca de dados com serviços web. Seja para persistir alguma informação na web ou para apresentar conteúdo sensível a localização e contexto. Tudo isso depende do bom e velho protocolo TCP/IP e sua lógica cliente/servidor.

Para dar mais ênfase à importância disso, basta lembrar ao leitor de que a rede de dados na maioria dos países do mundo ainda não está no mesmo ponto de qualidade que desejamos. Sendo assim, existe latência, pontos de intermitências e até mesmo as famosas sombras, regiões onde não existe conectividade. Neste caso, se uma requisição for feita, a resposta ao usuário pode demorar alguns longos segundos.

Para finalizar o cenário, imagine que a aplicação faz tudo de forma síncrona, ou seja, ao efetuar uma requisição HTTP e esperar pela resposta, a aplicação trava e simplesmente não deixa o usuário efetuar mais nenhuma operação. Qual o resultado disso?

  • O usuário vai imaginar que a aplicação deu algum problema e clicar repetidamente em vários pontos da tela. Talvez, em um destes momentos a aplicação volte a responder a eventos e uma nova requisição será feita;
  • O usuário pode simplesmente fechar a aplicação por imaginar que a mesma apresentou algum problema e parou de funcionar quando, na verdade, ela só está esperando a resposta do servidor de forma passiva;
  • O usuário perde a paciência com sua aplicação e desinstala a mesma passando a usar sua concorrente.

Desta forma, é imprescindível construir aplicações Android onde todas requisições HTTP para persistir ou consumir dados de serviços web sejam feitas de forma assíncrona, não permitindo uma má impressão por parte do usuário.

Neste artigo será apresentada uma forma de fazer isso através da própria API do Android, além de alguns frameworks/APIs (Application Programming Interface) que tornam o trabalho do desenvolvedor muito rápido. Para completar, deixam o código limpo e totalmente separado em camadas, uma boa prática exigida pelo mercado para bons profissionais de programação.

Para consolidar os conceitos aqui apresentados, um aplicativo será construído para trocar informações com um serviço web criado com o Java Enterprise Edition e NetBeans.

Desenvolvendo o lado servidor

O componente servidor será simples, visto que o foco deste artigo é parte da requisição assíncrona da aplicação Android. Sendo assim, o container Java EE ficará responsável somente por dois Servlets Java. O primeiro chamado InsereCarro e o segundo RecuperaCarros. Além disso, uma classe de modelo de dados será criada com o nome de Carro. Para iniciamos o desenvolvimento, vejamos na Listagem 1 a definição da classe Carro.

public class Carro {
    
    public String nome;
    public int ano;
    public String marca;
    public float preco;
    
}
Listagem 1. Classe Carro

A classe contém apenas os atributos pertencentes ao objeto carro. Para manipular um objetivo do tipo Carro, criamos na Listagem 2 a classe InsereCarro.

Logo na primeira linha é encontrada uma anotação que só é possível na especificação do Servlet 3.0. Está sendo configurado o caminho /InsereCarro dentro do path da aplicação web para esta instância de servlet. Por esta razão, a URL para acionar este serviço será http://localhost:8080/artigo/InsereCarro?lista_de_parametros. Com esta anotação não é preciso editar o arquivo web.xml e fazer todos os mapeamentos de servlets com seus nomes e caminhos.

Na linha 2 temos a declaração da classe, sendo ela filha de HpptServlet. Somente através desta herança é possível a criação de um servlet. Na linha 4 foi criado um Vector que persistirá os objetos Carro.

Em seguida, na linha 6 temos o método processRequest que recebe como parâmetro uma instância de HttpServletRequest e uma instância de HttpServletResponse. Simplesmente são os objetos que transformam para o mundo Java a forma de funcionamento do protocolo TCP/IP: uma requisição feita pelo cliente e a resposta emitida pelo servidor.

O processRequest é chamado pelos métodos sobrescritos do Get e do Post. O GET e o POST são dois métodos do protocolo HTTP, mas existem outros, como PUT, DELETE, HEAD, TRACE, CONNECT, OPTIONS e PATCH.

Já dentro do método processRequest da linha 8 é configurado o tipo de conteúdo que o servidor emitirá como resposta ao pedido de requisição efetuado pelo cliente. Para tanto, foi utilizado o método setContentType.

Posteriormente, na sequência de linhas da 9 até a 12 são recuperados os parâmetros que são anexados à chamada da URL (http://localhost:8080/artigo/InsereCarro?nome=Fusca&marca=Wolks&ano=1982&preco=10000). A API do Servlet nos fornece o método getParameter para tal tarefa e nela definimos o nome do parâmetro. Nos tipos de dados int e float foram necessários os castings para o tipo correspondente visto que o retorno do método é uma String.

1:  @WebServlet(urlPatterns = {"/InsereCarro"})
2:  public class InsereCarro extends HttpServlet {
3:
4:    public static Vector<Carro> carrosSalvos = new Vector<Carro>();
5:    
6:    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
7:            throws ServletException, IOException {
8:        response.setContentType("text;charset=UTF-8");
9:        String nome = request.getParameter("nome");
10:        int ano = Integer.parseInt(request.getParameter("ano"));
11:        String marca = request.getParameter("m ... 

Quer ler esse conteúdo completo? Seja um assinante e descubra as vantagens.
  • 473 Cursos
  • 10K Artigos
  • 100 DevCasts
  • 30 Projetos
  • 80 Guias
Tenha acesso completo