Capítulo 10: Sincronização de dados
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
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
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
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
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
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
Exercício 01: AlunoConverter

M.Sc. Márcio Palheta

8/55
Exercício 01: AlunoConverter

Novo pacote

M.Sc. Márcio Palheta

9/55
Exercício 01: AlunoConverter

Novo pacote

Nova classe
para conversão
de Alunos em
Arquivo JSON

M.Sc. Márcio Palheta

10/55
Exercício 01: AlunoConverter
Converte Alunos
em dados JSON

M.Sc. Márcio Palheta

11/55
Exercício 01: AlunoConverter
Criação de objeto
de escrita e
estrutura inicial

Converte Alunos
em dados JSON

M.Sc. Márcio Palheta

12/55
Exercício 01: AlunoConverter
Conversão de
Tipos de dados

M.Sc. Márcio Palheta

13/55
Exercício 01: AlunoConverter
Conversão de
Tipos de dados

Fechamento da
Estrutura e retorno
do código gerado

M.Sc. Márcio Palheta

14/55
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
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
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
Exercício 02: classe WebClient

M.Sc. Márcio Palheta

18/55
Exercício 02: classe WebClient
Novo pacote

M.Sc. Márcio Palheta

19/55
Exercício 02: classe WebClient
Novo pacote
Nova classe para
envio dos dados

M.Sc. Márcio Palheta

20/55
Exercício 02: classe WebClient
Definições da URL
para comunicação

M.Sc. Márcio Palheta

21/55
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
Exercício 02: classe WebClient
Objetos para
comunicação

M.Sc. Márcio Palheta

23/55
Exercício 02: classe WebClient
Objetos para
comunicação

Formatação e
envio dos dados

M.Sc. Márcio Palheta

24/55
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
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
Exercício 03: ListaAlunosActivity.java

M.Sc. Márcio Palheta

27/55
Exercício 03: ListaAlunosActivity.java

M.Sc. Márcio Palheta

28/55
Exercício 03: ListaAlunosActivity.java

M.Sc. Márcio Palheta

29/55
Exercício 03: ListaAlunosActivity.java

M.Sc. Márcio Palheta

30/55
Exercício 03: ListaAlunosActivity.java

M.Sc. Márcio Palheta

31/55
Exercício 03: ListaAlunosActivity.java

M.Sc. Márcio Palheta

32/55
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
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
Exercício 04: EnviaAlunosTask.java

M.Sc. Márcio Palheta

35/55
Exercício 04: EnviaAlunosTask.java
Novo pacote

M.Sc. Márcio Palheta

36/55
Exercício 04: EnviaAlunosTask.java
Novo pacote
Classe filha de
AsyncTask

M.Sc. Márcio Palheta

37/55
Exercício 04: EnviaAlunosTask.java
Novo pacote
Classe filha de
AsyncTask

Tipo de retorno

M.Sc. Márcio Palheta

38/55
Exercício 04: EnviaAlunosTask.java
Novo pacote
Classe filha de
AsyncTask

Tipo de retorno

M.Sc. Márcio Palheta

39/55
Exercício 04: EnviaAlunosTask.java
Novo pacote
Classe filha de
AsyncTask

Tipo de retorno

M.Sc. Márcio Palheta

40/55
Exercício 04: EnviaAlunosTask.java
Novo pacote
Classe filha de
AsyncTask

Tipo de retorno

M.Sc. Márcio Palheta

41/55
Exercício 04: EnviaAlunosTask.java
Novo pacote
Classe filha de
AsyncTask

Tipo de retorno

M.Sc. Márcio Palheta

42/55
Exercício 04: Continuação...

M.Sc. Márcio Palheta

43/55
Executado ANTES
da sincronização

Exercício 04: Continuação...

M.Sc. Márcio Palheta

44/55
Executado ANTES
da sincronização

Exercício 04: Continuação...

Método que executa
a sincronização

M.Sc. Márcio Palheta

45/55
Executado ANTES
da sincronização

Exercício 04: Continuação...

Método que executa
a sincronização

Executado DEPOIS
da sincronização

M.Sc. Márcio Palheta

46/55
Exercício 05: ListaAlunosActivity

M.Sc. Márcio Palheta

47/55
Exercício 05: ListaAlunosActivity

M.Sc. Márcio Palheta

48/55
Execute novamente a App

M.Sc. Márcio Palheta

49/55
Execute novamente a App

M.Sc. Márcio Palheta

50/55
Execute novamente a App

M.Sc. Márcio Palheta

51/55
Execute novamente a App

M.Sc. Márcio Palheta

52/55
O que vem a seguir?
●

Fragments

●

Google Maps

●

GPS

M.Sc. Márcio Palheta

53/55
Referências
●

www.caelum.com.br

●

d.android.com

●

●

LECHETA, Ricardo. Google Android, 3a edição,
Novatec, São Paulo, 2013
Código fonte completo:
https://github.com/marciopalheta/cursosandroid

M.Sc. Márcio Palheta

54/55
Capítulo 10: Sincronização de dados

Capítulo 10 - Sincronização de dados usando JSON