Integrando um App a um Web Service

Sejam bem vindos a mais um tutorial sobre programação para android.
Dessa vez integrando um app a um web service.
Escrevi um tutorial sobre como fazer um web service simples (server-side) e esse tutorial complementa, mostrando como fazer um app que ‘consome’ o web service.
Vai ser um app simples. O app quando se inicia, busca no servidor uma lista de produtos e cria botões com os produtos.

Integrando um App a um Web Service

Integrando um App a um Web Service

Integrando um App a um Web Service

Cada botão quando pressionado lista os dados do produto.
Tudo muito simples e básico. Apenas para inspirar a criação de apps mais elaboradas que se comuniquem com um server.

Vamos criar um novo app (pelo AIDE ou pelo Visual Studio ou pelo Eclipse)

Vamos editar o arquivo androidanifest.xml

Assim o app se inicia na vertical, sem a barra de titulo e com premissões para acessar a internet

Uma maneira de criar layouts para apps para android e atravéz dos arquivos de layout ‘.xml’
É uma maneira mais tradicional !

Mas esse tutorial irá criar dinamicamente os elementos do layout (os botões e textos).
Então nosso arquivo ‘main.xml’ será mais simples:

Vamos começar a programar no arquivo MainActivity.java

Esse é o começo.
Vamos criar um botão dinamicamente.
Para isso precisaremos de importar a classe ‘Button’ e a classe ‘LinearLayout’:
import android.widget.LinearLayout;
import android.widget.Button;

E vamos escrever o código que adiciona o botão ao layout:

Já dá para salvar e testar !
Esse é o começo.

Para podermos ‘descomentar’ o ‘setOnClickListener’ vamos antes criar o metodo DadosdoProduto.

Vamos importar o ‘OnClickListener’, o ‘OnClickListener’ e o ‘TextView’:
import android.view.View.OnClickListener;
import android.view.OnClickListener;
import android.widget.TextView;

Vamos criar a classe que servirá para exibirmos os dados do produto:

Já podemos descomentar a linha
b.setOnClickListener(new DadosdoProduto());

Temos o ‘rascunho’ desse app de demostração.
É basicão e deve funcionar assim…
Criando dinamicamente (on the fly) (em tempo de execução) os elementos do layout.
Vai lembrar-nos um pouco da técnica de requisição assíncrona ‘ajax’…

Pode testar para ver como tá funcionando… Mas falta o principal: Buscar os dados no ‘server’! No webservice que criamos no outro tutorial

Vamos fazer o app exibir uma lista de produtos.
Cada produto será um botão.
E essa lista deve vir do ‘server’.

Algum tempo atrás eu criei uma classe  que faz essa comunicação com o servidor.
Essa classe ‘Requisicao’ é a base desse tutorial !!!

Eu ralei um pouco pra chegar até ela, e estou disponibilizando aqui gratuitamente!

Ela ‘extende’ a classe ‘AsyncTask’, e deve implementar o método ‘doInBackground’.
Porque ela é executada ‘por debaixo dos panos’ enquanto o app esta rodando…

Vamos importar:
import android.os.AsyncTask;

E vamos precisar dessas 4 variaveis:

E para elas funcionarem precisamos importar:
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.StatusLine;

Vamos ‘tentar’ fazer um POST no server, e trazer o resultado…
Literalmente tentar.

Lembrando que esse código é executado em ‘background…’, ‘por detras dos panos…’ !
É aqui que a mágica acontece !

vamos importar
import java.net.URI;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.NameValuePair;
import org.apache.http.HttpResponse;
import org.apache.http.HttpEntity;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import android.widget.Toast;
import java.util.List;
import java.util.ArrayList;

Desse ‘imports’, acho interessante ressaltar o ‘Toast’ que é uma espécie de ‘alert’.
Realmente bem interessante !

E pra parar o erros devemos declarar algumas variáveis (atributos da classe MainActivity):

O código ate aqui fica:

Já temos ‘criada’ a classe que fará a requisição ao server !
Vamos usá-la!!!

No onCreate:

Isso fará a requisição…
Mas se você executar… Não verá o resultado.
Porquê precisamos esperar a resposta do server…

Esperar quanto tempo ???
Não sabemos quanto tempo o ‘server’ vai demorar pra responder…

Para resolver essa situação vamos criar um método que ‘de tempos em tempos’ verifica se o server ja respondeu.
E caso já tenha a repososta do server, então chame o método que cria os botões…

Vamos importar umas classes que servem para chamar um método de tempos em tempos (já apresentei essas classes em um outro tutorial)

import java.util.Timer;
import java.util.TimerTask;
import android.os.Handler;

Vamos declarar umas variáveis (da MainActivity):

E o onCreate fica:

Repare que excluímos aquele código que criava um botão.
Agora ‘quem’ irá criar os botões é a classe ‘gerabotoesprodutos’ !

Vamos criar ela:
Ela é bem interessante. Recebe a resposta ‘json kind’ do server e cria os botões.

Pode testar e ver que os botões são criados em tempo de execução.
Repare que a função ‘split’ separa o ids do nome do produto pela string “#@#@” que criamos no outro tutorial (muito amador)…

Se você quiser comprovar que os dados são dinâmicos, você pode acessar o C.R.U.D. (create read update delete) e bricar/testar um pouco. Só peço que deixe pelo menos uns cinco produtos cadastrados lá, para o próximo internauta que acessar esse tutorial também poder entender…

Então já temos um básico app que busca dados na web e cria botões!
O código por enquanto é:

Falta fazer funcionar a exibição dos dados do produto.
Para isso vamos criar uma variável que armazena os códigos dos produtos (lembrando que nossa hospedagem gera ids alfanumericos longos…)

atributo da MainActivity…

Vamos ‘descomentar’ aquela linha ‘catalogo[x]=produto[0];’ na gerabotoesprodutos.

Essa linha ‘relaciona’ cada id de produto a um índice…
Um índice que a classe ‘DadosdoProduto’ pode acessar (utilizando o ‘id’ do botão que a chamou).

Vamos editar a classe ‘DadosdoProduto’ para ela também fazer uma requisição (buscar os dados do produto):

E vamos criar a ‘exibeproduto’:

O código fica:

Qualquer dúvida me envie um e-mail: [email protected]

Avalie esse Post