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

Post on 18-Dec-2014

3.073 views 4 download

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

Capítulo 10: Sincronização de dados

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

● marcio.palheta@gmail.com

● sites.google.com/site/marciopalheta

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

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

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

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

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

}

M.Sc. Márcio Palheta

8/55

Exercício 01: AlunoConverter

M.Sc. Márcio Palheta

9/55

Exercício 01: AlunoConverter Novo pacote

M.Sc. Márcio Palheta

10/55

Exercício 01: AlunoConverter

Nova classepara conversãode Alunos em Arquivo JSON

Novo pacote

M.Sc. Márcio Palheta

11/55

Exercício 01: AlunoConverter

Converte Alunosem dados JSON

M.Sc. Márcio Palheta

12/55

Exercício 01: AlunoConverter

Converte Alunosem dados JSON

Criação de objetode escrita e

estrutura inicial

M.Sc. Márcio Palheta

13/55

Exercício 01: AlunoConverter

Conversão deTipos de dados

M.Sc. Márcio Palheta

14/55

Exercício 01: AlunoConverter

Conversão deTipos de dados

Fechamento daEstrutura e retornodo código gerado

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": "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 } ] } ]}

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

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);

}

M.Sc. Márcio Palheta

18/55

Exercício 02: classe WebClient

M.Sc. Márcio Palheta

19/55

Exercício 02: classe WebClient

Novo pacote

M.Sc. Márcio Palheta

20/55

Exercício 02: classe WebClient

Nova classe para envio dos dados

Novo pacote

M.Sc. Márcio Palheta

21/55

Exercício 02: classe WebClient

Definições da URLpara comunicação

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

M.Sc. Márcio Palheta

23/55

Exercício 02: classe WebClient

Objetos para comunicação

M.Sc. Márcio Palheta

24/55

Exercício 02: classe WebClient

Formatação eenvio dos dados

Objetos para comunicação

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

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"}

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

Exercício 03: ListaAlunosActivity.java

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

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

M.Sc. Márcio Palheta

35/55

Exercício 04: EnviaAlunosTask.java

M.Sc. Márcio Palheta

36/55

Exercício 04: EnviaAlunosTask.javaNovo pacote

M.Sc. Márcio Palheta

37/55

Exercício 04: EnviaAlunosTask.java

Classe filha deAsyncTask

Novo pacote

M.Sc. Márcio Palheta

38/55

Exercício 04: EnviaAlunosTask.java

Classe filha deAsyncTask

Novo pacote

Tipo de retorno

M.Sc. Márcio Palheta

39/55

Exercício 04: EnviaAlunosTask.java

Classe filha deAsyncTask

Novo pacote

Tipo de retorno

M.Sc. Márcio Palheta

40/55

Exercício 04: EnviaAlunosTask.java

Classe filha deAsyncTask

Novo pacote

Tipo de retorno

M.Sc. Márcio Palheta

41/55

Exercício 04: EnviaAlunosTask.java

Classe filha deAsyncTask

Novo pacote

Tipo de retorno

M.Sc. Márcio Palheta

42/55

Exercício 04: EnviaAlunosTask.java

Classe filha deAsyncTask

Novo pacote

Tipo de retorno

M.Sc. Márcio Palheta

43/55

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

M.Sc. Márcio Palheta

44/55

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

M.Sc. Márcio Palheta

45/55

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

Método que executaa sincronização

Executado ANTESda sincronização

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

M.Sc. Márcio Palheta

47/55

Exercício 05: ListaAlunosActivity

M.Sc. Márcio Palheta

48/55

Exercício 05: ListaAlunosActivity

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

Execute novamente a App

M.Sc. Márcio Palheta

53/55

O que vem a seguir?

● Fragments

● Google Maps

● GPS

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

Capítulo 10: Sincronização de dados