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

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

description

Neste capítulo discutimos o processo de sincronização de dados de uma App Android com uma App WEB, usando JSON e Tarefas Assíncronas

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

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

Capítulo 10: Sincronização de dados

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

M.Sc. Márcio Palheta

Instrutor

● Programador desde 2000

● Aluno de doutorado

● Mestre em informática pelo ICOMP/UFAM

● Especialista em aplicações WEB – FUCAPI

[email protected]

● sites.google.com/site/marciopalheta

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

M.Sc. Márcio Palheta

3/55

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

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

M.Sc. Márcio Palheta

4/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

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

M.Sc. Márcio Palheta

5/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

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

M.Sc. Márcio Palheta

6/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

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

M.Sc. Márcio Palheta

7/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) {…

}

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

M.Sc. Márcio Palheta

8/55

Exercício 01: AlunoConverter

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

M.Sc. Márcio Palheta

9/55

Exercício 01: AlunoConverter Novo pacote

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

M.Sc. Márcio Palheta

10/55

Exercício 01: AlunoConverter

Nova classepara conversãode Alunos em Arquivo JSON

Novo pacote

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

M.Sc. Márcio Palheta

11/55

Exercício 01: AlunoConverter

Converte Alunosem dados JSON

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

M.Sc. Márcio Palheta

12/55

Exercício 01: AlunoConverter

Converte Alunosem dados JSON

Criação de objetode escrita e

estrutura inicial

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

M.Sc. Márcio Palheta

13/55

Exercício 01: AlunoConverter

Conversão deTipos de dados

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

M.Sc. Márcio Palheta

14/55

Exercício 01: AlunoConverter

Conversão deTipos de dados

Fechamento daEstrutura e retornodo código gerado

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

M.Sc. Márcio Palheta

15/55

String gerada

● 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/

{ "list": [ { "aluno": [ { "id": 1, "nome": "Maria de Oliveiras", "telefone": "092 3224567", "endereco": "Rua vai e volta", "site": "http://www.google.com", "email": "[email protected]", "nota": 4 }, { "id": 2, "nome": "Joana Silva", "telefone": "21456627", "endereco": "Rua A, 25, CD", "site": "www.joana.com", "email": "[email protected]", "nota": 8 } ] } ]}

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

M.Sc. Márcio Palheta

16/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

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

M.Sc. Márcio Palheta

17/55

Prévia do código

//Objeto para comunicacao com servidor remotoDefaultHttpClient httpClient = new DefaultHttpClient();//Objeto para encapsular a String gerada com JSONHttpPost 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 JSONpost.setHeader("Content-type", "application/json");post.setHeader("Accept", "application/json");//Execucao da requisicaoHttpResponse response = httpClient.execute(post);//Verificacao da repostaString jsonResposta =

EntityUtils.toString(response.getEntity());

return jsonResposta;

} catch (Exception e) {throw new RuntimeException(e);

}

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

M.Sc. Márcio Palheta

18/55

Exercício 02: classe WebClient

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

M.Sc. Márcio Palheta

19/55

Exercício 02: classe WebClient

Novo pacote

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

M.Sc. Márcio Palheta

20/55

Exercício 02: classe WebClient

Nova classe para envio dos dados

Novo pacote

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

M.Sc. Márcio Palheta

21/55

Exercício 02: classe WebClient

Definições da URLpara comunicação

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

M.Sc. Márcio Palheta

22/55

Exercício 02: classe WebClient

Definições da URLpara comunicação

Método para envio de dados JSON

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

M.Sc. Márcio Palheta

23/55

Exercício 02: classe WebClient

Objetos para comunicação

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

M.Sc. Márcio Palheta

24/55

Exercício 02: classe WebClient

Formatação eenvio dos dados

Objetos para comunicação

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

M.Sc. Márcio Palheta

25/55

Exercício 02: classe WebClient

Formatação eenvio dos dados

Objetos para comunicação

ProcessamentoDa resposta doServidor WEB

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

M.Sc. Márcio Palheta

26/55

Exercício 02: classe WebClient

Formatação eenvio dos dados

Objetos para comunicação

ProcessamentoDa resposta doServidor WEB

Retorna o IP solicitante: {"ip": "189.48.181.194"}

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

M.Sc. Márcio Palheta

27/55

Exercício 03: ListaAlunosActivity.java

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

M.Sc. Márcio Palheta

28/55

Exercício 03: ListaAlunosActivity.java

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

M.Sc. Márcio Palheta

29/55

Exercício 03: ListaAlunosActivity.java

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

M.Sc. Márcio Palheta

30/55

Exercício 03: ListaAlunosActivity.java

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

M.Sc. Márcio Palheta

31/55

Exercício 03: ListaAlunosActivity.java

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

M.Sc. Márcio Palheta

32/55

Exercício 03: ListaAlunosActivity.java

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

M.Sc. Márcio Palheta

33/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

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

M.Sc. Márcio Palheta

34/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

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

M.Sc. Márcio Palheta

35/55

Exercício 04: EnviaAlunosTask.java

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

M.Sc. Márcio Palheta

36/55

Exercício 04: EnviaAlunosTask.javaNovo pacote

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

M.Sc. Márcio Palheta

37/55

Exercício 04: EnviaAlunosTask.java

Classe filha deAsyncTask

Novo pacote

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

M.Sc. Márcio Palheta

38/55

Exercício 04: EnviaAlunosTask.java

Classe filha deAsyncTask

Novo pacote

Tipo de retorno

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

M.Sc. Márcio Palheta

39/55

Exercício 04: EnviaAlunosTask.java

Classe filha deAsyncTask

Novo pacote

Tipo de retorno

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

M.Sc. Márcio Palheta

40/55

Exercício 04: EnviaAlunosTask.java

Classe filha deAsyncTask

Novo pacote

Tipo de retorno

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

M.Sc. Márcio Palheta

41/55

Exercício 04: EnviaAlunosTask.java

Classe filha deAsyncTask

Novo pacote

Tipo de retorno

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

M.Sc. Márcio Palheta

42/55

Exercício 04: EnviaAlunosTask.java

Classe filha deAsyncTask

Novo pacote

Tipo de retorno

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

M.Sc. Márcio Palheta

43/55

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

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

M.Sc. Márcio Palheta

44/55

Exercício 04: Continuação...Executado ANTESda sincronização

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

M.Sc. Márcio Palheta

45/55

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

Método que executaa sincronização

Executado ANTESda sincronização

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

M.Sc. Márcio Palheta

46/55

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

Método que executaa sincronização

Executado ANTESda sincronização

Executado DEPOISda sincronização

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

M.Sc. Márcio Palheta

47/55

Exercício 05: ListaAlunosActivity

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

M.Sc. Márcio Palheta

48/55

Exercício 05: ListaAlunosActivity

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

M.Sc. Márcio Palheta

49/55

Execute novamente a App

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

M.Sc. Márcio Palheta

50/55

Execute novamente a App

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

M.Sc. Márcio Palheta

51/55

Execute novamente a App

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

M.Sc. Márcio Palheta

52/55

Execute novamente a App

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

M.Sc. Márcio Palheta

53/55

O que vem a seguir?

● Fragments

● Google Maps

● GPS

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

M.Sc. Márcio Palheta

54/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

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

Capítulo 10: Sincronização de dados