Escolar Documentos
Profissional Documentos
Cultura Documentos
Contedo
JSON
AsyncTask
Implementao Server
Implementao Client
Estudo de Caso
A Ton To Toys uma empresa que comercializa bonecos de briquedo. Atualmente, a
empresa utiliza a Internet como principal canal de comercializao de seus produtos.
Por meio de seu site, os clientes podem visualizar e comprar os diversos modelos de
bonecos. Contudo, a empresa deseja dar um passo alm e criar um canal de vendas
para dispositivos mveis. Sendo assim, foi solicitado o desenvolvimento de um app
Android com a possibilidade de exibir os produtos e tambm efetuar a compra dos
mesmos.
Arquitetura
Atualmente, a arquitetura composta por um servidor Tomcat e uma base de dados
oracle, onde a aplicao de e-commerce executada
A idia incluir a camada cliente Android acessando o servidor Tomcat para obter as
informaes da base de dados de produtos por meio da Internet, via HTTP
Os dados sero transmitidos de um lado a outro no formato JSON
CLIENTE
SERVIDOR
HTTP
JSON
JSON
O JSON (Javascript Object Notation) uma forma de encapsular dados de maneira
padronizada
Ao invs de utilizar a sintaxe XML em um webservice pode-se aplicar JSON que uma
estrutura mais leve
Referncia: http://www.json.org/json-pt.html
Os objetos podem ser encapsulados no lado servidor em formato JSON, transmitidos
para o cliente onde sero transformados novamente em objetos
O cliente tambm pode encapsular seus dados no formato JSON e transmit-los para o
servidor, no processo inverso
Sintaxe JSON
Imagine a seguinte classe que representa os produtos e uma instncia p1:
ProdutoBean
- id:int
- nome: String
- preco: float
- ativo: boolean
p1
- id = 100
- nome: Boneco Mergulhador
- preco: 50.0
- ativo: true
Na sintaxe JSON:
- Representao do atributo nome "nome":"Boneco Mergulhador"
- Representao do objeto p1
{"id":100, "nome":"Boneco Mergulhador", "preco":50.0, "ativo":true}
Arrays JSON
Vamos supor a existncia de 2 instncias de ProdutoBean:
ProdutoBean
- id:int
- nome: String
- preco: float
- ativo: boolean
p1
- id = 100
- nome: Mergulhador
- preco: 50.0
- ativo: true
p2
- id = 200
- nome: Caipira
- preco: 55.0
- ativo: true
Na sintaxe JSON:
"bonecos": [ {"id":100, "nome":"Mergulhador", "preco":50.0, "ativo":true},
{"id":200, "nome":"Caipira", "preco":55.0, "ativo":true} ]
Veja que os caracteres [ e ] indicam um array
Neste caso, bonecos representa um array com dois objetos do tipo ProdutoBean
7
obj2.put("id", 200);
obj2.put("nome", "Caipira");
obj2.put("preco", 55.0f);
obj2.put("ativo", true);
[{"id":100,"preco":50,"ativo":true,"nome":"Mergulhador"},
{"id":200,"preco":55,"ativo":true,"nome":"Caipira"}]
10
Finalmente, temos o exemplo inverso, isto , obter um objeto JSONObject a partir de uma
String no formato JSON
Executanto o cdigo acima, exibimos o valor do atributo nome de todos os objetos contidos no
array JSON referenciado pela varivel v
a.length() retorna o total de elementos contidos no array
Ento s efetuar um loop sobre os elementos do array e acessar os atributos desejados
a.getJSONObject(i).getString("nome") retorna o valor do atributo nome
a.getJSONObject(i).getDouble("preco") retorna o valor do atributo preo...
11
Implementao Servidor
Voltando preparao no lado servidor, ser necessrio criar um servlet dedicado a
oferecer os servios que sero consumidos pelo cliente Android
Tais servios recebero as requisies, efetuaro os processamentos necessrios e
gerao uma resposta no formato JSON
CLIENTE
SERVIDOR
HTTP
Servlet
JSON
12
Implementao Servlet
@WebServlet("/JSONServlet")
public class JSONServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
JSONObject obj1 = new JSONObject();
obj1.put("id", 100);
obj1.put("nome", "Mergulhador");
obj1.put("preco", 50.0f);
obj1.put("ativo", true);
JSONObject obj2 = new JSONObject();
obj2.put("id", 200);
obj2.put("nome", "Caipira");
obj2.put("preco", 55.0f);
obj2.put("ativo", true);
JSONArray array = new JSONArray();
array.put(obj1);
array.put(obj2);
// gera a resposta em formato texto codificado em UTF-8 (acentos, etc..)
response.setCharacterEncoding("UTF-8");
response.getWriter().print(array);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
13
Testando o Servlet
Ao efetuar uma chamada GET no servidor, o retorno deve ser o seguinte:
14
AsyncTask
O acesso a recursos externos, por exemplo um web service, deve ser feito em um
thread separado do main thread
Main thread onde a aplicao executada
Assim, caso algo bloqueie o main thread, toda a aplicao comprometida
Soluo: utilizar um thread separado para acesso ao recurso externo
Problema: somente a main thread pode atualizar views da interface do usurio
Soluo melhor: utilizar AsyncTask
15
Classe AsyncTask
AsyncTask permite realizar operaes em um thread separado do main thread
Alm disso, oferece um mecanismo para atualizar views da interface do usurio
Para implementar um AsyncTask basta extender a classe:
AsyncTask<Parametro, Progresso, Resultado>
Onde:
Parametro - tipo de objeto a ser passado como parmetro
Progresso - indicador de progresso da operao
Resutado - tipo de objeto que recebe o resultado da operao
Todos os parmetros so opcionais - utilizar Void quando o parmetro for opcional
16
Mtodos de AsyncTask
A classe AsyncTask oferece alguns mtodos que podem ser implementados:
onPreExecute() - acionado antes da execuo da tarefa
doInBackground(Parametro... p) - onde a operao desejada executada - obrigatrio
onProgressUpdate(Progresso... p) - chamado quando houver atualizao do progresso
da atividade, pelo mtodo publishProgress(Progresso...)
onPostExecute(Resultado r) - acionado ao trmino da tarefa
Veja que os tipos de dados dos parmetros devem corresponder aos tipos declarados na
classe genrica AsyncTask<Parametro, Progresso, Resultado>
17
18
onPreExecute()
doInBackground()
terminou
onPostExecute()
atualizar progresso...
onProgressUpdate()
19
Executar a AsyncTask
Para executar a AsyncTask, basta acionar o mtodo execute e efetuar a passagem dos
parmetros definidos no mtodo doInBackground:
MinhaTarefa mt = new MinhaTarefa();
mt.execute("A", "B", "C");
Veja que os parmetros "A", "B" e "C" sero tratados como um array dentro do mtodo
doInBackground:
protected String doInBackground(String... params) {
int totalString = params.length;
for (int i = 0; i < totalString; i++)
Log.i("MinhaTask", params[i]);
}
20
HttpClient
O HttpClient uma classe disponvel nativamente na plataforma Android
utilizada para realizar requisies HTTP (POST, GET, etc...) do cliente para o servidor
Por exemplo, uma requisio GET
String url = "http://www.fiap.com.br";
InputStream content = null;
try {
HttpClient httpclient = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
// executa a requisio GET
HttpResponse response = httpclient.execute(get);
// obtm o contedo retornado pela requisio GET
content = response.getEntity().getContent();
} catch (Exception e) {
e.printStackTrace();
}
21
22
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
</manifest>
23
Acesso Localhost
Ateno!!!
Para acessar o localhost (127.0.0.1) a partir do emulador (AVD) deve-se utilizar o
seguinte endereo IP:
10.0.2.2
http://10.0.2.2:8080/MeuServico
24
Passando Parmetros
Os parmetros de uma requisio podem ser encapsulados em um BasicNameValuePair
Cria-se uma lista de parmetros (BasicNameValuePair), adiciona-se todos os parmetros
necessrios a ela e depois a coloca no formato URL (URLEncodedUtils)
String url = "http://10.0.2.2:8080/MeuServico/ServicoServlet";
List<NameValuePair> params = new LinkedList<NameValuePair>();
// adiciona os parmetros um a um...
params.add(new BasicNameValuePair("param1", "valor1");
params.add(new BasicNameValuePair("param2", "valor2");
url = url + "?" + URLEncodedUtils.format(params, "utf-8");
Como resultado:
http://10.0.2.2:8080/MeuServico/ServicoServlet?param1=valor1¶m2=valor2
25
Requisio POST
Exemplo de POST
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
List<NameValuePair> nvList = new ArrayList<NameValuePair>();
BasicNameValuePair bnvp = new BasicNameValuePair("name", name);
nvList.add(bnvp);
post.setEntity(new UrlEncodedFormEntity(nvList));
HttpResponse resp = client.execute(post);
InputStream is = resp.getEntity().getContent();
26