2. Instrutor
●
Programador desde 2000
●
Aluno de doutorado
●
●
●
●
Mestre em informática pelo
ICOMP/UFAM
Especialista em aplicações
WEB – FUCAPI
marcio.palheta@gmail.com
sites.google.com/site/marcio
palheta
M.Sc. Márcio Palheta
3. Agenda
●
Na estrada, até aqui
●
Gerando JSON
●
Classe para conversão da lista de alunos em JSON
●
Classe para comunicação com servidor WEB remoto
●
Envio da lista de alunos para um servidor remoto
●
Tarefas assíncronas
M.Sc. Márcio Palheta
3/55
4. Pensando além...
●
●
●
●
Agora que nossa App toca parte da música de abertura do
Supernatural, ao receber um SMS de um aluno, queremos
avançar um pouco
Vamos sincronizar os dados da App com um servidor de
web remoto
Não vamos discutir o serviço web, mas você pode baixar o
código de exemplo no repositório do curso:
https://github.com/marciopalheta/cursosandroid
M.Sc. Márcio Palheta
4/55
5. Integração baseada em JSON
●
●
●
●
JSON é uma estrutura leve e fácil de trabalhar, muito
aderente ao ambiente mobile
Podemos representar facilmente os dados de um Objeto
Java em um arquivo de formato amigável
A leitura e escrita de dados via JSON já é nativa da
maioria das linguagens de programação comerciais
Apesar de parecido com XML, o JSON ganhou espaço por
ser de fácil utilização com JavaScript
M.Sc. Márcio Palheta
5/55
6. Vamos conhecer componentes JSON
●
O JSON é nativo do Android, que já traz as classe
necessárias à sua implementação:
●
JSONObject: Coleção de pares do tipo Chave/Valor
●
JSONArray: Sequencia ordenada de valores
●
●
JSONStringer: Objeto usado para criação de arquivos com
dados no formato JSON
JSONException: Exceção lançada quando falha na
estrutura de dados do JSON for detectada
M.Sc. Márcio Palheta
6/55
7. Passo a passo
●
●
●
Vamos criar uma classe especialista em converter uma
Coleção de Alunos em um arquivo JSON
A essa classe, chamaremos AlunoConverter
Nosso Converter deve oferecer o método toJSON(), que
recebe uma lista da alunos como parâmetro:
public String toJSON(List<Aluno> lista) {
…
}
M.Sc. Márcio Palheta
7/55
15. String gerada
{
"list": [
{
"aluno": [
{
"id": 1,
"nome": "Maria de Oliveiras",
"telefone": "092 3224567",
"endereco": "Rua vai e volta",
"site": "http://www.google.com",
"email": "maria@gmail.com",
"nota": 4
},
{
"id": 2,
"nome": "Joana Silva",
"telefone": "21456627",
"endereco": "Rua A, 25, CD",
"site": "www.joana.com",
"email": "joana@gmail.com",
"nota": 8
}
]
}
]
}
●
O método toJSON() da
classe AlunoConverter
gerar uma string parecida
com essa aí ao lado
●
Temos uma array list
●
E outro array aluno
●
●
Você pode validar Strings
JSON no site:
http://jsonlint.com/
M.Sc. Márcio Palheta
15/55
16. Comunicação com servidor remoto
●
●
●
●
●
Vamos criar uma classe especialista em comunicação
com servidores WEB
Para isso, precisamos de um objeto DefaultHttpClient
Para envio dos dados, podemos escolher entre GET ou
POST
Vamos usar o POST, porque o arquivo a ser enviado pode
ser muito grande e o GET tem limitações de número de
parâmetros suportados
Precisamos de um HttpPost
M.Sc. Márcio Palheta
16/55
17. Prévia do código
//Objeto para comunicacao com servidor remoto
DefaultHttpClient httpClient = new DefaultHttpClient();
//Objeto para encapsular a String gerada com JSON
HttpPost post = new HttpPost(url);
try {
post.setEntity(new StringEntity(json));
//Informa que o conteudo da requisicao eh JSON e
//Solicita que a resposta tambem seja em JSON
post.setHeader("Content-type", "application/json");
post.setHeader("Accept", "application/json");
//Execucao da requisicao
HttpResponse response = httpClient.execute(post);
//Verificacao da reposta
String jsonResposta =
EntityUtils.toString(response.getEntity());
return jsonResposta;
}
} catch (Exception e) {
throw new RuntimeException(e);
M.Sc. Márcio Palheta
17/55
20. Exercício 02: classe WebClient
Novo pacote
Nova classe para
envio dos dados
M.Sc. Márcio Palheta
20/55
21. Exercício 02: classe WebClient
Definições da URL
para comunicação
M.Sc. Márcio Palheta
21/55
22. Exercício 02: classe WebClient
Definições da URL
para comunicação
Método para envio
de dados JSON
M.Sc. Márcio Palheta
22/55
23. Exercício 02: classe WebClient
Objetos para
comunicação
M.Sc. Márcio Palheta
23/55
24. Exercício 02: classe WebClient
Objetos para
comunicação
Formatação e
envio dos dados
M.Sc. Márcio Palheta
24/55
25. Exercício 02: classe WebClient
Objetos para
comunicação
Formatação e
envio dos dados
Processamento
Da resposta do
Servidor WEB
M.Sc. Márcio Palheta
25/55
26. Exercício 02: classe WebClient
Objetos para
comunicação
Formatação e
envio dos dados
Retorna o IP solicitante:
{"ip": "189.48.181.194"}
Processamento
Da resposta do
Servidor WEB
M.Sc. Márcio Palheta
26/55
33. Executando a App
●
●
●
Quando tentamos rodar a nossa App:
A operação de comunição com um servidor remoto é
imprevisível, podendo demorar, travando a UIThread
A tarefa de sincronização deve rodar em outra thread
M.Sc. Márcio Palheta
33/55
34. Envio assíncrono de dados
●
●
●
●
●
Vimos que não podemos executar tarefas “possivelmente”
demoradas na thread principal UIThread
Precisamos utilizar uma tarefa assíncrona, independente
Para isso usamos a AsyncTask, onde podemos isolar o
processo de comunicação com o servidor remoto
Durante o processo, vamos exibir uma barra de progresso
Ao final, vamos exibir a resposta enviada pelo servidor
web
M.Sc. Márcio Palheta
34/55