Primeiras aulas do curso Android com Web Service parte 1: Sincronize sua app com o servidor

Android com Web Service parte 1: Sincronize sua app com o servidor

Introdução à sincronização - Introdução

Introdução

Seja bem-vindo ao nosso curso de Android com Web Service parte 1. Neste curso continuaremos a trabalhar com a aplicação de agenda desenvolvida nos cursos de Android I, II e III. Caso não tenha feito estes cursos, recomendamos que os faça antes de prosseguir com este.

Recentemente recebemos do cliente um e-mail dizendo que aplicação de Agenda perdeu todos os registros realizados na mesma. Isso aconteceu logo após o aparelho passar por algum problema com o qual precisou-se refazer a instalação do aplicativo. Mas por que isso aconteceu?

Quando desenvolvemos a aplicação, inicialmente fizemos uso de um banco de dados chamado SQLite, o qual permitia armazenar os registros da agenda, porém, esse banco fazia parte da aplicação e a partir do momento em que a aplicação precisou ser removida do aparelho, o banco de dados também foi perdido. Dito isso, Como podemos resolver esse problema?

A solução seria fazer com que a aplicação possa ter um backup desses dados em um serviço externo ao aparelho, onde ela possa ter sempre uma cópia das informações, poder salvar e recuperar essas informações depois. Isso tudo em uma aplicação web, um serviço web (webservice) com o qual a Agenda possa sincronizar os dados.

A intenção é que tenhamos a listagem e cadastro dos registros tanto na Agenda quanto no webservice e que os dois sejam sincronizados. A imagem abaixo ilustra a listagem dos contatos nas duas aplicações.

listagem dos registros na agenda web e mobile

A listagem por hora está vazia, porém, se cadastrarmos o Alex como aluno em nossa Agenda, ele deve aparecer nas duas aplicações como ilustra a imagem abaixo:

Aluno Alex na agenda e na web

Caso façamos também o cadastro via aplicação web, o registro também deve ser exibido no aplicativo de Agenda. Neste exemplo, cadastramos a aluna Maria.

Aluna Maria cadastrada pela web

A sincronização inicialmente para ser feita no aplicativo, terá de ser feita fechando e abrindo novamente o aplicativo. Porém, melhoraremos isso depois.

O resultado final será as duas aplicações podendo cadastrar e visualizar os alunos. Claro, também deixaremos a aplicação preparada para questões de unicidade, onde cadastros realizados ao mesmo tempo não corram o risco de um sobrescrever informações do outro.

Faremos também com que a sincronização seja automatizada e que com isso a experiência do usuário seja melhorada. A aplicação cliente, no caso, o aplicativo Android será notificada que houveram mudanças nos registros e carregará essas mudanças automaticamente.

Contudo, não veremos todos esses detalhes apenas neste curso. Como dito anteriormente, a proposta inicial é fazer com que as aplicações se comuniquem bem. Nos próximos cursos melhoraremos ainda mais nossa aplicação.

Vamos começar?

Introdução à sincronização - Entendendo o problema

Entendendo o problema

Com o ambiente pronto e a aplicação iniciada, testamos cadastrar dois alunos no nosso aplicativo android através do emulador e tudo parece funcionar perfeitamente.

alunos cadastrados no aplicativo android

A preparação do ambiente e execução inicial do aplicativo android deve ser feita neste exercício. Onde o passo a passo é explicado detalhadamente.

Contudo, o problema relatado pelo cliente não foi esse. É preciso desinstalar a aplicação para verificar o problema real. Experimente realizar a desinstalação do aplicativo e após isso executá-la novamente pelo Android Studio. O processo de instalação é feito e pode demorar um pouco por causa do build do Gradle.

aplicação perdeu os alunos cadastrados

Como já comentamos, o problema está no fato de estarmos salvando todas as informações no próprio aparelho. Ao limparmos os dados do aplicativo, desinstalarmos, ou formatarmos o mesmo, perdemos todas as informações, mesmo se salvássemos os dados em um arquivo independente do aplicativo.

Depender do aparelho para conseguirmos salvar e manter todas as informações cadastradas no aplicativo apesar de ser uma boa ideia inicialmente, não é uma solução muito boa, pois qualquer problema com o aparelho fará com que possamos perder tudo.

Nas próximas aulas veremos como resolver esse problema salvando os dados do Aluno em uma aplicação externa ao aparelho. Em um webservice.

Introdução à sincronização - Preparando ambiente para o envio do aluno

Preparando ambiente para o envio do aluno

Com o servidor em execução, podemos acessá-lo pelo endereço localhost:8080 e visualizar que nele há uma aplicação semelhante à do aplicativo Android. Temos o formulário de cadastro de alunos:

cadastro de alunos no servidor

O passo a passo para execução do servidor pode ser seguido este exercício

Podemos também visualizar a listagem desses alunos:

listagem dos alunos cadastrados

Como nosso primeiro passo será fazer com que os alunos da aplicação Android sejam enviados para a aplicação web, lembre-se de remover os alunos da aplicação web para que os resultados sejam mais fáceis de perceber.

Além de termos uma página inicial elegante:

página inicial da agenda no servidor

Como preferência pessoal, configuramos os atalhos do Android Studio. Por padrão ele utiliza dos mesmos atalhos do IntelliJ, porém faremos com que possamos usar os atalhos comuns do Eclipse. Para isso precisamos a tecla shift duas vezes e na caixa de pesquisa, digitamos keymap como sugere a imagem abaixo:

pesquisando keymap

Após clicarmos na opção Keymap, podemos escolher qual das configurações disponíveis utilizar. Escolhemos a configuração do Eclipse.

keymap do eclipse

Nosso próximo passo é descobrir em que momento na aplicação Android o aluno está sendo salvo no banco de dados, por que é nesse passo onde devemos agir para salvar o aluno em outro lugar. Caso lembre-se de como foi codificada a aplicação nos cursos anteriores, saberá que esse código encontra-se na classe FormuarioActivity, a qual podemos facilmente buscar e abrir usando os atalhos do Android Studio. Pressionando shift duas vezes, podemos fazer buscas por toda a IDE.

buscando a classe FormularioActivity

O código que nos interessa é o que trata do click do botão para salvar o aluno. Ele pode ser visto ao final da classe, é o método onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_formulario_ok:
            Aluno aluno = helper.pegaAluno();

            AlunoDAO dao = new AlunoDAO(this);
            if (aluno.getId() != null) {
                dao.altera(aluno);
            } else {
                dao.insere(aluno);
            }
            dao.close();

            Toast.makeText(FormularioActivity.this, "Aluno " + aluno.getNome() + " salvo!", Toast.LENGTH_SHORT).show();

            finish();
            break;
    }
    return super.onOptionsItemSelected(item);
}

Note que, os passos para salvar o aluno são: receber o objeto aluno, verificar a existência de seu id, se seu id não existir, inserimos um aluno novo, caso contrário, atualizamos o aluno.

Sabemos que para enviar o aluno para a aplicação web, precisamos realizar uma requisição. Porém, não podemos fazer essa requisição na thread principal por causa que a requisição pode demorar e isso irá travar a tela da aplicação android. A solução para isso é criar uma async task, isso fará com que a requisição seja feita em uma thread separada da principal.

Logo após o fechamento da conexão com o banco (dao.close()), iremos fazer uso da classe InsereAlunoTask, que será nossa assyc task. Esta classe precisa receber o aluno como argumento para poder executar sua tarefa. Até aqui teremos:

new InsereAlunoTask(aluno);

O Android Studio irá reclamar marcando o código de vermelho por que essa classe ainda não existe. Vamos criá-la então. Com o cursor sobre o nome da classe podemos usar o atalho Alt + Enter e selecionar a opção Create class:

criando classe InsereAlunoTask

A próxima tela nos pedirá informações sobre onde a classe deve ser criada e nela mudaremos apenas o pacote onde a classe será criada.

configurações de criação da classe

Selecionaremos o pacote Tasks, que é onde se encontram todas as classes que realizam async tasks em nosso projeto.

selecionando pacote tasks

O código inicial da classe é semelhante ao seguinte:

package br.com.alura.agenda.tasks;

import br.com.alura.agenda.modelo.Aluno;

class InsereAlunoTask {
    public InsereAlunoTask(Aluno aluno) {
    }
}

Precisamos agora fazer duas modificações em nosso código. A primeira delas é criar um atributo do tipo Aluno, não usaremos o objeto aluno apenas no construtor da classe, então precisaremos desse atributo para que possamos ter acesso ao objeto em outros pontos dessa classe. Usando o atalho Alt + Enter o Android Studio nos dará a opção create field for parameter aluno. Basta utilizá-la pressionando enter.

criando atributo aluno

O Android Studio ainda irá oferecer uma opção para nomear o atributo com outro nome diferente de aluno e pode ser que o modificador final seja oferecido para ser aplicado. Faz sentido deixar como final, então precisamos apenas clicar em OK.

aluno como final

Até então, nosso código está no seguinte estado:

package br.com.alura.agenda.tasks;

import br.com.alura.agenda.modelo.Aluno;

class InsereAlunoTask {
    private final Aluno aluno;

    public InsereAlunoTask(Aluno aluno) {
        this.aluno = aluno;
    }
}

O segundo passo é fazer com que nossa classe seja uma async task de verdade. Fazemos isso tornando nossa classe filha da classe AsyncTask. O Android Studio reclamará novamente por que a classe AsyncTask tem um método abstrato a ser implementado. Podemos usar o atalho Alt + Enter novamente com o cursor sobre o nome da classe e selecionar a opção Implement methods para resolver este problema:

implemente methods

Uma listagem de métodos será apresentada, porém, precisamos apenas clicar em OK.

lista de implement methods

O método doInBackground é adicionado em nossa classe e atualmente, nosso código estará neste estado:

package br.com.alura.agenda.tasks;

import android.os.AsyncTask;
import br.com.alura.agenda.modelo.Aluno;

class InsereAlunoTask extends AsyncTask{
    private final Aluno aluno;

    public InsereAlunoTask(Aluno aluno) {
        this.aluno = aluno;
    }

    @Override
    protected Object doInBackground(Object[] objects) {
        return null;
    }
}

Dentro do método doInBackground, precisamos escrever o código que irá enviar o aluno para o servidor. Precisamos de uma classe que faça a conexão entre nossa aplicação android e o servidor. Essa classe já existe no projeto e se chama WebClient.

Use o atalho de pesquisa pressionando shift duas vezes e pesquise pelas classes referidas.

Na classe WebClient temos um método post que anteriormente foi codificado para enviar as notas dos alunos para um servidor e de lá receber o cálculo da média das notas. Porém não queremos fazer isso, queremos enviar o aluno para o servidor.

O método post recebe um JSON como uma string para poder enviar os dados para o servidor. JSON É uma notação para objetos Javascript muito utilizada para transporte de dados na web. Podemos usar isso e fazer no método doInBackground algo como:

new WebClient().insere(json);

Sabendo que precisamos do aluno no formato JSON, como iremos fazer para converter nosso objeto Java, para uma string no formato JSON? Em nosso projeto já temos uma classe que ajuda nessa tarefa, lembra que o método post da classe WebClient envia um JSON? A classe que converte o aluno é a classe AlunoConverter.

A classe AlunoConverter já tem um método chamado converteParaJSON, porém esse é um método muito simples, ele apenas converte o aluno com seu nome e nota. Queremos mais que isso, queremos converter o aluno completamente. No método doInBackground da nossa classe, queremos fazer algo do tipo:

new AlunoConverter().converteParaJSONCompleto(aluno);

E assim obter uma string JSON com todos os dados do aluno. Vamos implementar esse método na classe AlunoConverter então. Lembre-se do atalho Alt + Enter e que temos que retornar uma string.

public String converteParaJSONCompleto(Aluno aluno) {
    return null;
}

No processo de transformar o objeto aluno em um JSON, precisamos fazer uso de um objeto da classe JSONStringer que irá construir o objeto JSON. Para a contrução desse objeto, usaremos o método object do objeto desta classe, porém, precisamos envolver todo esse código em um bloco try/catch por que podem haver exceções e o próprio Android Studio irá oferecer essa recomendação.

public String converteParaJSONCompleto(Aluno aluno) {
    JSONStringer js = new JSONStringer();

    try {
        js.object();
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return null;
}

Iniciamos a construção do objeto JSON que representa o aluno, agora precisamos definir as chaves e valores desse objeto utilizando os método key e value do objeto js, faremos isso informando os nomes dos campos e o seus valores de acordo com o objeto aluno da seguinte forma:

js.object()
        .key("nome").value(aluno.getNome())
        .key("endereco").value(aluno.getEndereco())
        .key("site").value(aluno.getSite())
        .key("telefone").value(aluno.getTelefone())
        .key("nota").value(aluno.getNota())
        .endObject();

Definimos todas as chaves, de acordo com os nomes dos atributos do abjeto aluno e definimos como valor, os valores também fornecidos pelo objeto aluno. Por último, usamos o método .endObject para encerrar a construção do objeto JSON.

Nosso último passo é retornar a representação em String do objeto js. Para isso, basta utilizar o método toString. Veja como ficou o código deste método por completo:

public String converteParaJSONCompleto(Aluno aluno) {
    JSONStringer js = new JSONStringer();

    try {
        js.object()
                .key("nome").value(aluno.getNome())
                .key("endereco").value(aluno.getEndereco())
                .key("site").value(aluno.getSite())
                .key("telefone").value(aluno.getTelefone())
                .key("nota").value(aluno.getNota())
                .endObject();
        return js.toString();
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return null;
}

Com essa representação pronta, podemos continuar com o processo de efetivamente enviar nosso aluno para o servidor.

Sobre o curso Android com Web Service parte 1: Sincronize sua app com o servidor

O curso Android com Web Service parte 1: Sincronize sua app com o servidor possui 234 minutos de vídeos, em um total de 53 atividades. Gostou? Conheça nossos outros cursos de Android em Mobile, ou leia nossos artigos de Mobile.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Android acessando integralmente esse e outros cursos, comece hoje!

  • 1155 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

Premium

  • 1155 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$75
à vista R$900
Matricule-se

Premium Plus

  • 1155 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$100
à vista R$1.200
Matricule-se

Max

  • 1155 cursos

    Cursos de programação, UX, agilidade, data science, transformação digital, mobile, front-end, marketing e infra.

  • Certificado de participação

    Certificado de que assistiu o curso e finalizou as atividades

  • App para Android e iPhone/iPad

    Estude até mesmo offline através das nossas apps Android e iOS em smartphones e tablets

  • Projeto avaliado pelos instrutores

    Projeto práticos para entrega e avaliação dos professores da Alura com certificado de aprovação diferenciado

  • Acesso à Alura Start

    Cursos de introdução a tecnologia através de games, apps e ciência

  • Acesso à Alura Língua

    Reforço online de inglês e espanhol para aprimorar seu conhecimento

12X
R$120
à vista R$1.440
Matricule-se
Procurando planos para empresas?
Acesso por 1 ano
Estude 24h/dia onde e quando quiser
Novos cursos toda semana