Library Retrofit 2 no Android

Receba em primeira mão o conteúdo exclusivo do Blog, além de promoções de livros e cursos de programação. Você receberá um email de confirmação. Somente depois de confirmar é que poderei lhe enviar o conteúdo exclusivo por email.

Email inválido.
Blog /Android /Library Retrofit 2 no Android

Library Retrofit 2 no Android

Vinícius Thiengo12/10/2015, Segunda-feira, às 18h
(4966) (47) (81) (3)

Opa, blz?

Nesse vídeo apresento a nova versão da library Retrofit, a Retrofit 2. Library criada pela Square, que já é bem conhecida pelas inúmeras outras libraries open source criadas no dev Android, Java e IOS. O Retrofit 2 é uma maneira eficiente e simples de realizar requisições HTTP de sua APP Android ou Java code. Segundo alguns posts de comparação de libs de HTPP request, o Retrofit (agora junto ao OkHttp) é a melhor escolha devido a facilidade, documentação e velocidade. No vídeo o foco é inteiramente em apresentar a library, é realizado “n” requisições de modo a apresentar como mudar o path de requisição, enviar imagens, enviar listas de objetos, buscar listas de objetos, enviar objeto, buscar objeto e alterar o header de requisição.

O Retrofit trabalha com annotations e objetos POJO (Plain Old Java Object), esse último são objetos que têm ao menos os getters e setters dos atributos listados e um construtor vazio. Com a criação de uma interface que trabalha como sendo a API dos métodos de requisição e o uso dos annotations nesses métodos, já é possível realizar requisições enviando ou / e solicitando dados. Em alguns contextos será necessário uma classe de desserialização de dados, na verdade, somente de ter objetos aninhados vindos do servidor e utilizando o Gson parse, essa classe que implementa a interface JsonDeserializer será necessária, mas é tranquila a construção dessa (apresentada no vídeo).

Dentre as formas de envio de dados apresentadas fique atento quanto a utilização do annotation @Body, pois com apresentado no vídeo, pode ser mais vantajoso utilizar o parse do Gson devido a utilização de uma entidade depreciada no PHP (se seu backend for em PHP) quando utilizando @Body. No script de envio de lista de objetos é apresentada essa forma alternativa de envio como o parse Gson sendo utilizado. A library Retrofit 2 trabalha com outras opções de parse Json, no vídeo foi utilizado apenas o Gson, por ele ser já conhecido pela maioria dos Android deve que utilizando parse Gson, mas as outras opções são: Jackson, Moshi, Protobuf, Wire e Simple XML (esse ultimo para XML parse).

No AndroidManifest.xml a permissão de Internet e no app level build.grade os compiles abaixo:

compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'

compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'

Sem mais delongas, acredito que o vídeo conseguiu apresentar bem a library, segue links do post.

GitHub do projeto (incluindo Android project e PHP project): https://github.com/viniciusthiengo/retrofit-example

Segue links das páginas utilizadas para a construção do vídeo:

Página da library Retrofit

Página do Retrofit no GitHub

Apresentação do Retrofit 2.0 no CheeseFactory Blog

Apresentação do Retrofit 2.0 no Codepath

Gson library tutorial no Codepath

Vlw

Receba em primeira mão o conteúdo exclusivo do Blog, além de promoções de livros e cursos de programação.
Email inválido

Relacionado

GCM Cloud Connection Server (XMPP). Push Message Android - Parte 5GCM Cloud Connection Server (XMPP). Push Message Android - Parte 5Android
GCM e AWS SNS. Push Message Android - Parte 6GCM e AWS SNS. Push Message Android - Parte 6Android
Parse Notification. Push Message Android - Parte 7Parse Notification. Push Message Android - Parte 7Android
Injeção de Dependência Com a lib Dagger 2 no AndroidInjeção de Dependência Com a lib Dagger 2 no AndroidAndroid

Compartilhar

Comentários Facebook

Comentários Blog (47)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Leonardo (1) (0)
07/02/2017, Terça-feira, às 12h
Ola, vc sabe qual é a API Android minima para o retrofit funcionar perfeitamente?
Responder
Vinícius Thiengo (0) (0)
07/02/2017, Terça-feira, às 13h
Leonardo, tudo bem?

A partir da API 9: "Retrofit requires at minimum Java 7 or Android 2.3"

Mas recomendo que dê suporte em sua APP Android de acordo com os números da página do link a seguir: https://developer.android.com/about/dashboards/index.html?hl=pt-br

Abraço.
Responder
Ruan Alves (1) (0)
01/12/2016, Quinta-feira, às 08h
Opa blz? ... Uma coisa que fiquei com dúvida, quando uso assincronia para buscar os dados, os métodos que trabalharam com o resultado dessa busca (list de informação) deverão ficar dentro do onResponse? ... Ou seja: Fiz requisição para buscar uma lista de cliente, quando busco eu preciso gerar um mensagem de sucesso e inserir essas informações no banco, no caso esses métodos e demais se necessitar deveram ficar dentro do onResponse? ...
Responder
Vinícius Thiengo (0) (0)
01/12/2016, Quinta-feira, às 09h
Ruan, tudo bem aqui.

Na verdade as invocações de seus métodos, que precisam dos resultados vindos do backend Web, podem estar no onResponse().

Mas você pode fazer isso de várias formas, criar um método que tenha todas as invocações e utilizar somente ele no onResponse().

Isso tudo, pois sua chamada é assíncrona, somente o onResponse() terá o retorno. A definição dos métodos não coloque no onResponse(), iria "embolar" o código. Abraço.
Responder
Ruan Alves (1) (0)
01/12/2016, Quinta-feira, às 09h
Show ... :)
Responder
Ruan Alves (1) (0)
27/11/2016, Domingo, às 18h
Opa Blz? Ótimo vídeo, parabéns ....

Seguinte estou com uma dúvida, tenho uma aplicação que vai ter um AlarmManager e dependendo como o usuário configurar o mesmo, vai realizar buscas no banco de dados de acordo com a configuração feita, no caso qual a comunicação que devo utilizar: síncronas e assíncronas? . E se for  assíncronas devo colocar algum Thread ?

Detalhes importantes:
- Aplicação recebera informações quando estiver em segundo plano
- Quando o usuário estiver utilizando e deu o tempo do alarme, a mesma irá buscar informações, ou seja irá utilizar o alarmManager e fiquei com dúvida da melhor maneira de trabalhar ...
Responder
Vinícius Thiengo (0) (0)
29/11/2016, Terça-feira, às 09h
Ruan, tudo bem aqui.

O AlarmManager não vai conseguir acionar nenhuma entidade que já inicie seus em uma Thread de background (Service, BroadcastReceiver ou Activity).

Logo você terá de trabalhar com o Retrofit de forma Assíncrona, ou você mesmo abrir uma nova Thread e trabalhar com ele dentro dela de forma síncrona, ou seja, terá de ter a Thread de background, escolha ficar com o Retrofit de forma assíncrona, pois ele já vai fazer o trabalha pesado de gerenciar a Thread de background.

Para seu projeto, ao menos essa parte de sincronização com servidor remoto, recomendo que utilize o GCMNetworkManager, pois essa entidade foi feita exatamente para isso, ter conexões remotas no background.

Para entender melhor o GCMNetworkManager veja o artigo / vídeo que tenho aqui no Blog:

http://www.thiengo.com.br/gcmnetworkmanager-para-execucao-de-tarefas-no-background-android

No link acima, não deixe de estudar e entender o Doze Mode, será um ponto importante para sua APP.

Para o AlarmManager, a documentação do Android recomenda que não se utilize junto a ele scripts que vão realizar tarefas de rede, Internet.

Abraço.
Responder
Ruan Alves (1) (0)
29/11/2016, Terça-feira, às 09h
Showwwwww ... Hoje cedo vi que você postou esse vídeo,  vou conferir ele logo a noite ... Uma dúvida sobre as mensagens, você sabe me informar como atualizar sozinha a minha recyclerview ex: estou na tela de listagem de dados e chegou nova informação, logo irei salvar no banco e ela deverá aparecer na minha recyclerview automaticamente ... alguma dica? ... desde já meus agradecimentos ... :)
Responder
Vinícius Thiengo (0) (0)
29/11/2016, Terça-feira, às 09h
Ruan, nesse caso você deve adicionar a nova informação a Lista de objetos que está vinculada ao adapter do RecyclerView e então acessar esse adapter invocando o método notifyDataSetChanged().

Na verdade o notifyDataSetChanged() é maneira mais brusca de atualizar a lista na tela, mas funciona.

Nos artigos / vídeos dos links abaixo falo sobre algumas maneiras mais sofisticadas de fazer isso:

http://www.thiengo.com.br/recyclerview-material-design-android-parte-2

http://www.thiengo.com.br/animacao-onlongpress-e-gridlayoutmanager-em-recyclerview-material-design-android-parte-3

Note que você não deve criar uma nova lista, e sim atualiza-la.

Não deixe de ler os comentários do artigos indicados.

Abraço.
Responder
Ruan Alves (1) (0)
29/11/2016, Terça-feira, às 15h
Opa Show ... Vou verificar, qualquer dúvida eu retorno ...
Responder
16/08/2016, Terça-feira, às 17h
Thiengo, muito boa sua explicacao.
Estou iniciando em android.
Meu app, vai registrar a localizacao dos usuarios em um server e vai ficar pegando de tempo em tempo as localizacoes que estiverem proximas num raio de 3km
e mostrar todos usuarios no mapa.
Estou usando Retrofit 2.
Vou fazer esse "mecanismo" no onLocationChanged .
Minha duvida é : vou ter que utilizar request assincrono ou sincrono do retrofit ?
Responder
Vinícius Thiengo (0) (0)
17/08/2016, Quarta-feira, às 22h
Fala Sergio, blz?
Assync tende a ser a melhor opção, mas se tiver já uma Thread secundária com boa parte da lógica de seu sistema, então experimente tb utilizando o Sync do Retrofit. Abraço
Responder
Maykon Pereira (1) (0)
28/07/2016, Quinta-feira, às 18h
Boa tarde Thiengo. Estou usando o Retrofit, mas estou tendo problema com palavras acentuadas e caracteres especiais ao enviá-los para o servidor. Os dados chegam no servidor normalmente, mas os acentos e caracteres especiais não chegam de forma correta. Você sabe uma solução pra esse tipo de problema ?
Responder
Vinícius Thiengo (0) (0)
02/08/2016, Terça-feira, às 01h
Fala Maykon, blz?
Já aplicou a conversão para utf8 ou até mesmo o inverso para ver se soluciona? Se seu backend for PHP, assim que os dados chegarem tente primeiro utf8_encode() e casa não tenha solucionado tente utf8_decode(). Veja se alguma funciona. Abraço
Responder
22/06/2016, Quarta-feira, às 11h
Valeu thiengo. muito boa sua explicação.
To usando o retrofit e realmente é uma mão na roda.

Tive problemas, assim como você, no parser de listas, quando essas vieram vazias.
Consegui solucionar inicializando a lista no construtor do meu objeto de resposta, assim:

public class PropostaListResponse {

    @SerializedName("Count")
    Integer count;

    @SerializedName("Propostas")
    List<Proposta> propostas;

    public PropostaListResponse() {
        this.propostas = new ArrayList<>();
    }
Responder
Vinícius Thiengo (0) (0)
22/06/2016, Quarta-feira, às 14h
Vlw Diego, abraço
Responder
Matheus Bed (1) (0)
08/04/2016, Sexta-feira, às 14h
Ei thiengo, estou com um problema
*pego uma lista de objetos do servidor por exemplo carros (nome, marca, velocidade maxima)
*depois eu quero colocar esses dados numa recycler view
eu consigo fazer isso o problema é que é muito inconstante hora aparece a lista com os dados e hora não aparece, você sabe qual é o problema?
Responder
Vinícius Thiengo (1) (0)
10/04/2016, Domingo, às 12h
Fala Matheus, blz?
Pode ser a lógica que vc criou para preenchimento do Recycler. Verifique se ao menos os dados sempre estão chegando a APP, logo antes de realizar o parse de json para objeto Java. Caso sim, isso é um indicio de que o problema está na lógica de preenchimento do RecyclerView.

Caso não, verifique no lado servidor como estão chegando as chamadas para carregamento de conteúdo, quando dar certo e quando não dá. Com isso poderá buscar o problema, pois esse não é um comportamento comum. Abraço
Responder
Matheus Bed (1) (0)
12/04/2016, Terça-feira, às 17h
Quando coloco o logcat pra testar se os dados estao chegando ta tudo ok, e quando coloco dados na recycler view que esta no codigo do app da tudo certo... entao realmente não sei qual o problema
Responder
Vinícius Thiengo (0) (0)
13/04/2016, Quarta-feira, às 08h
Bom, se os dados estão sempre chegando e quando os dados são locais o Recycler sempre responde, o que resta agora é verificar se sempre está ocorrendo o parse de JSON para objeto Java. Se os dados não tiverem em utf8 ou qualquer outro problema na string json ocasiona em um parse falho, na verdade o parse nem mesmo ocorre.

Tente tirando todas as palavras acentuadas e teste para ter certeza de que não é o problema do utf8. Abraço
Responder
Vinícius Thiengo (0) (0)
26/03/2016, Sábado, às 23h
Fala Santos, blz?
Esse link realmente não tem conteúdo, porém o segundo sim. Ou seja, está tudo ok com sua implementação do Retrofit, o problema está no link. Caso ele seja necessário entre em contato com os administradores do servidor e informe que a página está com indicação de conteúdo não encontrado. Abraço
Responder
Welisson (1) (0)
14/02/2016, Domingo, às 11h
Thiengo, bom dia. Enviei uma dúvida para você mas já consegui resolver, no meu caso o problema era com o formato da Data que eu enviava do php para o android. Resolvi enviando a data como string, ainda preciso ver como enviar corretamente como data mesmo.

Obrigado
Responder
Welisson (1) (0)
14/02/2016, Domingo, às 10h
Bom dia Thiengo, tudo bem? Estou tentando fazer um exemplo baseado nos seus usando retrofit 2 e php e esbarrei num erro que não sei como resolver e as explicações que achei no google não foram muito eficientes. O erro que me é aprensentado é: Use JsonReader.setLenient(true) to accept mal formed JSON at line 1 column 1 path $.

O Json que é formado no meu servidor PHP é:

[{
"idCustomerAgenda": 1,
"dateAgenda": "2016-02-14 10:23:50",
"salonName": "Salao 1",
"canDelete": true
}, {
"idCustomerAgenda": 2,
"dateAgenda": "2016-02-14 10:23:50",
"salonName": "Salao 1",
"canDelete": true
}]

pelo site jsonlint.com me informa que o Json é válido.

Saberia me dizer o por quê da mensagem de erro?

Obrigado
Responder
Vinícius Thiengo (0) (0)
14/02/2016, Domingo, às 19h
Como explicado no comentário logo depois desse, vc já resolveu. Abraço
Responder
Wanderson (1) (0)
01/02/2016, Segunda-feira, às 23h
E aí Vinícios, tudo bem?

Eu segui o vídeo com interesse na parte de lista de elementos Json, mais precisamente o método "getManyCars", e tudo tranquilo... só que quando eu fui executar pra ver o que estava retornando ele chegava no Log do "Runnable", mas não retornava nada. Coloquei um Log no listCars, mas ele gerou um erro de NullPointerException, mostrando que o objeto que eu estava recebendo estava como null.

O Json está nesse formato:
[
    {
        titulo: 'Car',
        imagem: 'car.jpg',
        data: '2016-01-22'
    },
    {
        titulo: 'Car2',
        imagem: 'car2.jpg',
        data: '2016-01-22'
    }
]

E a classe com os mesmos elementos, getters e setters e o construtor apenas setando os parâmetros, sem herdar nenhuma outra:

public News(String paramTitle, String paramImage, String paramData){
        title = paramTitle;
        image = paramImage;
        data= paramData;
}

O restante praticamente da mesma forma, mas a lista só retorna 'null'...
Responder
Vinícius Thiengo (0) (0)
06/02/2016, Sábado, às 20h
Fala Wanderson, blz sim
Essa estrutura de JSOn que postou vc obteve no LogCat no Android code ou é o que está no código de seu backend no server Web? Esse tipo de coisa acontece quando o error está no backend Web, se for PHP coloque:

if( !ini_get("display_errors") ){
    ini_set("display_errors", 1);
}

logo no inicio do código para ver se algo error é printado, ignore os warnings... depois remova o código acima, senão os warnings não deixarão seu json ser entregue. Abraço
Responder
Wanderson (1) (0)
07/02/2016, Domingo, às 13h
Oppa Vinícius!

Descobri o que foi, na minha URL eu havia colocado apenas "/json", só que por algum motivo ele não aceitava então coloquei uma URL mais longa tipo "/backend/json" e funcionou! :)
Responder
mbcampolino (1) (0)
09/01/2016, Sábado, às 03h
a pergunta que não quer calar...retrofit 2 ou volley thiengo
Responder
Vinícius Thiengo (1) (0)
09/01/2016, Sábado, às 08h
Retrofit 2.0 easy. Somente se encontrar algum caso que o Retrofit 2.0 não cobre (dificil). Abraço
Responder
Heraldo Gama (1) (0)
20/11/2015, Sexta-feira, às 07h
Alô pessoal !!!

Ai vai um link muito bom pra quem também usa o JSON no PostgreSQL.
https://www.pgcon.org/2014/schedule/attachments/328_9.4json.pdf
Responder
Heraldo Gama (2) (0)
18/11/2015, Quarta-feira, às 16h
Alô, pessoal.
Pra quem usa o banco de dados PostGreSQL 9.3 ou superior, vale lembrar que existe nele duas funções: json_object_agg() e json_agg() que retorna o resultado de uma query no formato JSON Object e JSON Array respectivamente. Agregando assim valor ao banco e diminuindo o numero de linhas de código num projeto  que usa o Retrofit ou outra Lib de acesso ao banco externo.
Responder
Jonatas Oliveira (1) (0)
08/11/2015, Domingo, às 02h
Aew THIENGO BLZ?

Estou com uma duvida.
Com o retrofit so consegui ver exemplos da realizaçao da chamada la do Call utilizando um objeto, que no seu exemplo foi o Car.
Mas eu estou acostumando com o modelo antigo. Meu arquivo php retorna um json enorme contendo todos os dados e eu trato isso no java android com o metodo JSONObject.
Gostaria de saber a melhor forma de eu fazer essa migraçao, se posso usar uma abordagem parecida com a antiga, ou se vou ter que utilizar os objetos e classes no android.

De ja agradeço, Abraço
Responder
Vinícius Thiengo (0) (0)
08/11/2015, Domingo, às 07h
Fala Jonatas, blz?
Com o Retrofit 2.0 vc terá de testar para ver se é possível manter esse modelo antigo que utiliza, sem uma library de apoio. Não vejo uma escolha boa utilizar o modelo raw (que vc utiliza hj) sendo que há libraries com o GSON que facilitam o parse para nós developers, vc acaba perdendo em produção, veja se não vale a pena mudar um pouco a estrutura de seu project para suportar esse modelo de library ao invés de manter o modelo antigo. Abraço
Responder
Jonatas Oliveira (1) (0)
08/11/2015, Domingo, às 12h
Aew thiengo, Valeu pela resposta.
Eu estava mesmo querendo saber sobre o desempenho desse meu metodo.
Entao baseado na sua resposta fiz algumas pesquisas e encontrei a library Google Gson.

Segui esse tutorial para implementar: http://blog.nkdroidsolutions.com/how-to-parsing-json-array-using-gson-in-android-tutorial/

E consegui rodar sem faz muitas alteraçoes, inclusive diminui algumas linhas de codigos  :D.

Vou terminar aqui com as implementaçoes. Brigadao, abraço.
Responder
28/10/2015, Quarta-feira, às 20h
Excelente vídeo!!
Quando puder publica um com o backend.
Abraço!
Responder
Pietro (1) (0)
15/10/2015, Quinta-feira, às 22h
Boa, Thiengo! vlw por mais esse vídeo!
Responder
Diones da Silva Camargo (1) (0)
14/10/2015, Quarta-feira, às 16h
Olá Vinicius, seus vídeos me ajudam muito que estou começando com Android. Gostaria de saber se seria possível fazer um vídeo sobre arquitetura ideal para utilizar em um projeto Android, vejo muito o pessoal criando se baseando no MVP.

Abraço!
Responder
Vinícius Thiengo (1) (0)
14/10/2015, Quarta-feira, às 19h
Fala Diones, blz?
O MVP está na lista de vídeos que pretendo fazer o mais cedo possível. Abraço
Responder
edcoffani (2) (0)
14/10/2015, Quarta-feira, às 13h
olá Vinicius, muito bom os vídeos, parabéns... queria saber se vc tem alguns exemplo de aplicativo consumindo webservice  soap estou tentando fazer meu tcc mas parei por falta de conhecimento, se poder relacionado a isso, não só eu, mas, muitos agradeceram. Continue assim esta ajudando muitos programadores novos a se levantar exclusive eu, muito obrigado.
Responder
Vinícius Thiengo (2) (0)
14/10/2015, Quarta-feira, às 13h
Fala edcoffani, blz?
Não tenho vídeos sobre SOAP WebService e Android, na verdade já trabalhei com SOAP XML no Android na primeira versão da APP, foi mt ruim a experiência, pois o parse XML no Android é pesado. Meu conselho é que utilize WebService com o formato JSON na comunicação Android-Server e vice-versa, pois além de ter um parse leve o uso dele é bem simples, no lado cliente (Android) e no lado servidor. Têm "n" libs que já fazem o trabalho pesado para ti no Android, o Retrofit é aparentemente a melhor opção, tem o OkHttp puro (http://square.github.io/okhttp/) e o Volley (http://www.thiengo.com.br/volley-no-android-entendendo-e-utilizando). Abraço
Responder
edcoffani (1) (0)
22/10/2015, Quinta-feira, às 12h
Obg Vinícius Thiengo estou começando agora, e o conselho é ótimo irei pesquisar e tentar fazer muito obg mesmo..
Responder
Anderson (1) (0)
13/10/2015, Terça-feira, às 11h
Essa Lib Retrofit 2 é melhor que o Volley ??
Responder
Vinícius Thiengo (0) (0)
13/10/2015, Terça-feira, às 13h
Fala Anderson, blz?
Segundo o que acompanhei em vários posts (alguns listados no conteúdo dessa publicação) ele é sim melhor, para todos os casos, não somente para casos que envolvem transações de grande volume de dados (onde o Volley não feito para). Veja no vídeo a facilidade de enviar uma imagem do Android para um servidor Web PHP. Abraço
Responder
peledsones (3) (0)
13/10/2015, Terça-feira, às 01h
Aee Thiengo, muito bom! brother, tem como fazer uma vídeo aula criando um CRUD com banco externo (MySQL) ou outro? ficarei agradecido! valeuu
Responder
Vinícius Thiengo (3) (0)
13/10/2015, Terça-feira, às 04h
Fala, blz?
Vou ver se consigo fazer esse, já fui solicitado a explicar o backend por outros tb. Vlw a dica. Abraço
Responder
heraldogama (3) (0)
15/10/2015, Quinta-feira, às 13h
Bom dia, sugiro o PostgreSQL, pois a cada dia tem se tornado referencia em SGBD Open Source.
Responder