Olá desenvolvedor Android !
Quando um novo projeto Android se inicia, de nada poucas coisas temos certeza, mas posso com segurança afirmar que há uma chance de uns 90% (ou mais), de que seja necessária alguma interação com um serviço web.
E nesse momento, muitos desenvolvedores acabam ficando em dúvida, seja porque estão começando agora na plataforma ou porque querem fazer isso da maneira mais eficiente. E essa segunda razão é muito importante, pois um consumo de dados da forma errada, pode tornar o seu app em um sugador de bateria e que pode ser o motivo de um usuário remover o seu aplicativo.
A regra de ouro
Primeira coisa que se deve ter em mente, é que qualquer operação de rede deve ser executada fora da UI thread (ou main thread). Pois como a operação de rede é bloqueante, poderia causar um travamento do app e acabar gerando um ANR (Application Not Responding), e mesmo que não haja nenhum bug, o app poderá ser encerrado.
Ps.: Para evitar surpresas quando publicar o seu app, durante o desenvolvimento você pode trabalhar com o StrictMode , que está presente desde a versão 2.3.
Uma maneira de se fazer isso de forma bem simples, é utilizando a AsyncTask (assista ao vídeo Next Level Tips: Usando AsyncTask ) que facilita o mecanismo de criação de tarefas em background, bem como a comunicação com a UI thread antes e depois da tarefa em segundo plano.
Você também pode utilizar um Service para fazer a comunicação Web, mas lembre-se que simplesmente executar uma tarefa em um serviço não significa necessariamente que a tarefa está sendo executada em uma nova thread.
E claro, é possível utilizar o conceito de worker thread com a criação direta de uma thread para executar a tarefa. O único ponto que se deve ter em mente nessa técnica é que uma thread não pode manipular diretamente objetos que causem uma modicação na Activity ou algo que esteja sendo exibido na tela.
Para mais detalhes sobre o uso de AsyncTasks e threads é recomendado a leitura do guia sobre Processos e Threads . Em outro post dessa série iremos abordar o uso de Services para a comunicação Web.
Começando pelo básico
Essa série de posts vai abordar as diversas maneiras de se fazer a comunicação Web a partir de apps Android. Mas antes de explorar técnicas mais avançadas, vamos partir do entendimento básico das operações HTTP e como isso pode ser feito de forma bem simples utilizando a biblioteca HttpClient , que já acompanha o core do Android.
Como exemplo, vamos ver como executar uma operação de GET e outra de POST. Mas, com base no código, é possível entender com a biblioteca funciona e facilmente realizar outros tipos de requisições como PUT e DELETE, além de ser fácil encontrar exemplos de envio de arquivos, formulários e etc.
GET
Uma requisição GET, normalmente é executada com alguns parâmetros na própria URL ou sem parâmetro algum. No caso de não haver necessidade de parâmetros, uma request GET poder ser criada diretamente com a URL do serviço:
HttpGet get = new HttpGet("http://www.seuservidor.com/metodoApi");
Se tiver algum parâmetro ou se simplesmente quiser tornar a chamada mais genérica, a montagem da URL pode ser feita com o método URIUtils.createURI . Vamos começar como seria a montagem dos parâmetros, utilizando um List:
List params = new ArrayList();
params.add(new BasicNameValuePair("param1", varParam1);
params.add(new BasicNameValuePair("param2", varParam2);
Depois é só usar a variável params na criação da URI e em seguida criar o HttpGet :
URI url = URIUtils.createURI("http", "www.seuservidor.com", 80,
"/metodoApi", URLEncodedUtils.format(params, "UTF-8"), null);
HttpGet get = new HttpGet(url);
E o próximo passo é criar um HttpClient e executar o método que se deseja, no caso um GET.
DefaultHttpClient hc = new DefaultHttpClient();
HttpResponse response = hc.execute(get);
E caso a resposta que está esperando seja algo com uma String , ou que precisa fazer o parse, basta transformar a resposta em String e dar o tratamento que seja necessário:
String responseString = EntityUtils.toString(response.getEntity());
POST
Simplificando um pouco, o POST tem como principal característica enviar os dados encapsulados em uma entidade, ao invés de utilizar a URL como é feito no método GET. Por isso o código é bem similar:
HttpPost post = new HttpPost("http://www.serservidor.com/metodoPOST");
Ou, pode usar a mesma lógica do exemplo dados anteriormente para construir a URL. Mas, como no POST não são enviados parâmetros na URL, o comando fica ainda mais simples:
URI url = URIUtils.createURI("http", "www.seuservidor.com", 80,
"/metodoPOST", null, null);
HttpPost post = new HttpPost(url);
Agora vamos criar a lista com os parâmetros, mas dessa vez adicioná-los a entidade do POST que fará o transporte:
List params = new ArrayList();
params.add(new BasicNameValuePair("param1", varParam1);
params.add(new BasicNameValuePair("param2", varParam2);
post.setEntity(new UrlEncodedFormEntity(params));
E então, seguindo a mesma lógica, vamos criar o HttpClient e executar o método:
DefaultHttpClient hc = new DefaultHttpClient();
HttpResponse response = hc.execute(post);
E por último, transforme a resposta em uma String , caso queira fazer algum processamento:
String responseString = EntityUtils.toString(response.getEntity());
Juntando as peças
Então, se você vai fazer um app que irá executar diversas operações HTTP, um caminho é criar métodos que encapsulem esse comportamento para que sejam facilmente invocados a partir de uma AsyncTask ou IntentService .
E nesse ponto, cada desenvolvedor acaba usando a prática que está mais acostumado, como por exemplo colocar como métodos estáticos em uma classe com construtor privado, implementar um pattern builder ou da forma que preferir.
Como um exemplo de integração, está disponível no GitHub o projeto
SimpleGetPostClient que demonstra as chamadas de métodos GET e POST para serviços Web. Para uma consulta rápida, abaixo estará a classe que contém os métodos e também a Activity de onde é feita a chamada.
To Be Continued...
Agora que você já sabe o básico do funcionamento da comunicação Web em aplicativos Android, nos próximos posts vamos discutir as técnicas utilizadas na hora de fazer a comunicação Web, alguns desafios muito comuns em apps que fazem muitas requisições, boas práticas e até sobre frameworks para facilitar a sua vida. Fique ligado!
Abraços e até a próxima
+Neto Marin
Android Developer Advocate
Códigos de exemplo: