Os materiais didáticos aqui disponibilizados estão licenciados através de Creative Commons Atribuição-SemDerivações-SemDerivados CC BY-NC-ND. Você possui a permissão para visualizar e compartilhar, desde que atribua os créditos do autor. Não poderá alterá-los e nem utilizá-los para fins comerciais.
Atribuição-SemDerivações-SemDerivados
CC BY-NC-ND
Cursos / Informática para Internet / Dispositivos Móveis / Aula
Com esse Servlet implementado e rodando dentro de um servidor na máquina local, podemos partir para o lado Android da comunicação. Nesse exemplo, estaremos apenas enviando uma requisição a esse Servlet e então exibindo a mensagem recebida ao usuário, utilizando um Toast. Vejamos a Listagem 7, que contém o código responsável por executar essa requisição.
public class HTTPURLCommunication extends Activity {
private static String ENDERECO = "http://10.0.2.2:8080/aula14/ServletHello";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Toast.makeText(this, connect("Aluno"), Toast.LENGTH_LONG);
}
public static String connect() {
HttpURLConnection connection = null;
BufferedReader rd = null;
String line = null;
URL serverAddress = null;
try {
serverAddress = new URL(ENDERECO);
connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.connect();
rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
line = rd.readLine();
} catch (MalformedURLException e) {
Log.e("ERROR", e.getMessage(), e);
} catch (IOException e) {
Log.e("ERROR", e.getMessage(), e);
}
return line;
}
public static String connect(String id) {
HttpURLConnection connection = null;
BufferedReader rd = null;
String line = null;
String request = "?id="+id;
URL serverAddress = null;
try {
serverAddress = new URL(ENDERECO+request);
connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.connect();
rd = new BufferedReader(new InputStreamReader( connection.getInputStream()));
line = rd.readLine();
} catch (MalformedURLException e) {
Log.e("ERROR", e.getMessage(), e);
} catch (IOException e) {
Log.e("ERROR", e.getMessage(), e);
}
return line;
}
}
Na Activity apresentada na Listagem 7, implementamos apenas o método onCreate() para inicializar a Activity e fazer a requisição, através do método connect(id), que passa um ID para o servidor que é retornado junto a resposta. Esse parâmetro, em situações reais, é muito importante, pois pode ser através desse ID que a consulta ao banco será feita, ou alguma consulta de outro tipo que necessite de um parâmetro por parte de quem fez a requisição.
O método connect() é o método responsável por fazer a conexão. Como podemos ver, ele utiliza a API HttpUrlConnection para tal. O primeiro passo para fazer a requisição bem sucedida é criar um objeto do tipo URL que conterá o endereço da requisição a ser feita, juntamente do parâmetro da requisição, se for necessário, como mostrado no método connect(id). Uma vez criado o URL, precisamos abrir uma conexão HTTP com o servidor com o qual faremos a comunicação. Para isso, criamos um objeto do tipo HttpUrlConnection e então requisitamos ao objeto URL que abra a conexão com o endereço que foi configurado. Ao abrir essa conexão, o URL retornará um objeto que pode ser transformado em um HttpUrlConnection, através de um cast.
Uma vez que tenhamos o objeto HttpUrlConnection com a conexão aberta, devemos configurar o método de requisição a ser utilizado, através do método setRequestMethod(), e então conectar ao servidor. Para isso, utilizamos o método connect() do objeto HttpUrlConnection.
Após a conexão ser realizada, se esta tiver sucesso, poderemos receber dados através de um objeto BufferedReader. Utilizando o método getInputStream() do HttpUrlConnection, podemos ler uma sequência de dados que será enviada pelo servidor. Essa sequência, quando passada por um InputStreamReader torna-se compreensível e pode ser armazenada em buffer através de um objeto BufferedReader. Perceba que é importante passar por esses dois passos para que tenhamos acesso correto aos dados que estejam sendo enviados pelo servidor.
Uma vez que tenhamos acesso a um objeto do tipo BufferedReader, podemos utilizar o método getLine() para pegar uma linha de conteúdo do que tenha sido enviado, no tipo string. Uma vez que tenhamos esse objeto do tipo string, podemos trabalhar com o que o servidor nos tenha retornado. No caso da Activity apresentada, esse valor é utilizado em um Toast para ser exibido ao usuário.
Perceba que durante o processo de conexão alguns erros podem ocorrer. Esses erros, exceções do tipo IOException ou MalformedURLException, precisam ser tratados utilizando try/catch ou então lançados para cima. Caso sejam lançados, é necessário ter certeza que alguém acima de sua Activity será capaz de tratar esses erros, ou eles poderão gerar o encerramento inesperado de sua aplicação.
Também é importante notar que fazer conexões HTTP leva tempo. Caso conexões sejam feitas como no exemplo exibido, dentro da thread principal, é muito provável que haja uma grande pausa na aplicação, o que pode gerar desconforto para o usuário e, principalmente, uma Activity Not Responding (ANR) que pode levar ao encerramento da aplicação. Para evitar esse tipo de perda de desempenho, o Android disponibiliza ao usuário uma interface para realizar requisições assíncronas. Vejamos agora como essa interface funciona.
Versão 5.3 - Todos os Direitos reservados