Library Retrofit 2 no Android

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

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

Library Retrofit 2 no Android

Vinícius Thiengo
(21107) (59)
Go-ahead
"O método consciente de tentativa e erro é mais bem-sucedido que o planejamento de um gênio isolado."
Peter Skillman
Prototipagem Android
Capa do curso Prototipagem Profissional de Aplicativos
TítuloAndroid: Prototipagem Profissional de Aplicativos
CategoriasAndroid, Design, Protótipo
AutorVinícius Thiengo
Vídeo aulas186
Tempo15 horas
ExercíciosSim
CertificadoSim
Acessar Curso
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Lendo
TítuloDomain-driven Design Destilado
CategoriaEngenharia de Software
Autor(es)Vaughn Vernon
EditoraAlta Books
Edição1ª
Ano2024
Páginas160
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Tudo bem?

No vídeo acima é apresentada a versão 2.0 da mais popular e eficiente biblioteca Android para comunicação com servidores remotos, a biblioteca Retrofit, também conhecida como Retrofit 2.

Esta biblioteca foi desenvolvida, e ainda é mantida, pela Square, empresa muito conhecida pelas inúmeras bibliotecas open source criadas para o mundo de desenvolvimento: Android; Java; e iOS.

A API Retrofit 2 (API é um outro nome, neste artigo, para biblioteca) é a maneira mais eficiente, porém não a mais simples, de realizar requisições HTTP partindo de um aplicativo Android ou de um aplicativo não mobile escrito em Java ou em Kotlin.

Thiengo, como assim "não mais simples"?

É isso mesmo. Infelizmente está é uma das principais críticas dos desenvolvedores Android à biblioteca Retrofit. Em relação a algumas outras APIs de comunicação remota no Android a Retrofit vem sendo a que exige mais códigos quando em implantação.

Porém não se engane, muitas dessas APIs "mais fáceis" de se configurar não são mantidas com regularidade, algumas estão com mais de um ano sem atualização, têm inúmeros problemas, principalmente quando a quantidade de dados em tráfego, envio de vídeo, por exemplo, é grande. Algo que a Retrofit API trabalha com maestria.

Existem até mesmo alguns artigos na Web que comparam várias outras bibliotecas HTTP com a Retrofit API, e acaba que a Retrofit vence nos principais requisitos:

  • Consistência em funcionamento;
  • e Documentação completa.

No vídeo deste artigo o foco é integralmente na prática, em apresentar a biblioteca por completo. São realizadas inúmeras requisições de modo a mostrar:

  • Como mudar o path, caminho, de requisição;
  • Enviar binários (aqui utilizaremos imagens);
  • Enviar listas de objetos;
  • Buscar listas de objetos;
  • Enviar objeto;
  • Buscar objeto;
  • e Alterar o cabeçalho (header) de requisição.

A Retrofit API é uma daquelas APIs que trabalham com anotações, algo que alivia em muito a codificação de implantação da biblioteca no aplicativo cliente, e com objetos POJO (Plain Old Java Object), objetos esses que têm todos os métodos getters e setters de seus atributos e têm também ao menos um construtor vazio.

Utilizando a Retrofit API será necessária a criação de ao menos uma Interface que na verdade será a API da biblioteca no código cliente, API contendo os métodos de requisição, métodos que farão uso de algumas anotações para informar à biblioteca qual será a configuração de invocação HTTP de cada um deles.

Note que em alguns contextos será necessária uma classe de desserialização de dados, na verdade, somente se houver objetos aninhados vindos do servidor remoto, como resposta.

Para essa classe de desserialização será necessária a implementação do método JsonDeserializer e também o uso de alguma API de desserialização de dados. Uma bem popular e comum para as tarefas de serialização e de desserialização em aplicativos Android é a API Gson, apresentada também em vídeo.

Dentre as formas de envio de dados apresentadas em vídeo, fique atento quanto a utilização da anotação @Body, pois como informado na vídeo aula, pode ser uma melhor escolha utilizar o parse da Gson API devido a possíveis problemas de entidades depreciadas no PHP (se seu back-end Web for em PHP).

Exatamente no algoritmo de envio de lista de objetos, no vídeo, é apresentada essa maneira alternativa de envio utilizando o parser Gson.

Outras boas opções de parser para trabalho em conjunto com a biblioteca Retrofit são as seguintes:

  • Jackson;
  • Moshi;
  • Protobuf;
  • Wire;
  • e Simple XML (esse último para XML parser).

Se você está no início do desenvolvimento Android é importante saber que para conexões remotas é preciso a configuração de permissão de Internet no AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>

<uses-permission android:name="android.permission.INTERNET"/>

...
</manifest>

 

E também a seguinte configuração no Gradle Nível de Aplicativo, ou build.gradle (Module: app), para manter o uso da versão 2.0 da Retrofit API:

...
dependencies {
...

/* Para utilizar a biblioteca Retrofit 2.0 */
implementation 'com.squareup.retrofit:retrofit:2.0.0-beta2'

/* Para utilizar a biblioteca Gson 2.0.0 com a Retrofit 2.0 */
implementation 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
}
...

 

Apesar de no código acima estarmos utilizando as referências às bibliotecas com implementation, o correto e mais atual, na vídeo aula, devido ao tempo, data, em que ela foi construída (mesmo assim ela ainda e válida) é utilizado compile.

Mas você deve seguir com implementation em sua instalação do Android Studio.

Antes de finalizar, vou deixar alguns links de outros conteúdos do Blog, com vídeos, que lhe colocarão em dia com o que há de atual no mundo de desenvolvimento Android:

E caso você tenha, como uma de suas metas, aprender a criar aplicativos Android, ou evoluir nesta área, também com o conteúdo gratuito do Blog e canal, então não deixe de acessar a lista de estudos em: Estudando Android - Lista de Conteúdos do Blog.

Não esqueça de se inscrever 📫na lista de e-mails do Blog para receber todos os conteúdos Android em primeira mão.

Se inscreva também no canal do Blog no YouTube para acompanhar as últimas novidades liberadas lá.

Surgindo dúvidas ou dicas, pode enviar abaixo na área de comentários que logo eu lhe respondo.

Abraço.

Projeto de exemplo

Para acessar o projeto de exemplo utilizado em vídeo, incluindo o lado Web, entre no GitHub dele em: https://github.com/viniciusthiengo/retrofit-example.

Versões da biblioteca

É muito importante que você utilize em seus projetos a versão mais atual da biblioteca Retrofit, isso, pois as versões atuais de qualquer biblioteca tendem a vir mais eficientes, leves e seguras.

O link para acesso a documentação oficial da Retrofit API está logo abaixo na seção "Fontes".

Fontes

Documentação oficial biblioteca Retrofit

GitHub da biblioteca Retrofit

Retrofit 2.0: The biggest update yet on the best HTTP Client Library for Android

Consuming APIs with Retrofit

GitHub da biblioteca Gson

Square Open Source

Plain Old Java Objects

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
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 (59)

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...
28/02/2021
Eu tenho uma página simples - http - e desejo executá-la e obter dados dela (consumir API) a partir do Java em Android Studio. Estou disposto a pagar por instruções focadas nessa minha necessidade. Existe essa possibilidade?

valmir@gerensys.com.br
Responder
Vinícius Thiengo (0) (0)
07/03/2021
Valmir, tudo bem?

Eu lhe respondi em e-mail, dê uma olhada lá.

Abraço.
Responder
deiviti (1) (0)
18/12/2020
estou procurando como receber a mensagem de erro da api caso o usuario ou senha seja invalido.... mas não sei como fazer!




    private lateinit var mSharedPreference: SharedPreference

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        supportActionBar?.hide()

        button_login.setOnClickListener {

            val usuario = edit_Usuario.text.toString()
            val senha = edit_Senha.text.toString()

            if (TextUtils.isEmpty(usuario)) {
                edit_Usuario.error = "Ops!Complete o campo Usuario"
                edit_Usuario.requestFocus()
                return@setOnClickListener
            }

            if (TextUtils.isEmpty(senha)) {
                edit_Senha.error = "Ops!Complete o campo senha"
                edit_Senha.requestFocus()
                return@setOnClickListener
            }

            val call = RetrofitConfig().usuarioService().login(usuario, senha)
            call.enqueue(object : Callback<UsuarioModel> {
                override fun onResponse(
                    call: Call<UsuarioModel>, response: Response<UsuarioModel>
                ) {
               if (response.code()!= Wms_Constantes.HTML.Sucess){
                   val validation = Gson().fromJson(response.errorBody()!!.string(), String::class.java)
                   Toast.makeText(this@MainActivity,validation,Toast.LENGTH_LONG).show()
               }else{
                   startActivity(Intent(this@MainActivity,ArmazemActivity::class.java))
               }

                }

                override fun onFailure(call: Call<UsuarioModel>, t: Throwable) {
                    Toast.makeText(this@MainActivity, t.message, Toast.LENGTH_LONG).show()
                }

            })


        }
    }




//no caso queria colocar na tela a resposta da api de erro,não sei se preciso convertela para json ou não
abraço
Responder
Vinícius Thiengo (0) (0)
05/01/2021
Deiviti, tudo bem?

Neste caso a sua necessidade é inteiramente de lógica de negócio.

Como o erro de login não se caracteriza como uma falha de sistema...

então eu recomendo que você, no backend Web, devolva uma resposta de "erro" com características de uma resposta bem sucedida.

Ou seja, mesmo com o erro de autenticação a resposta JSON do backend Web será processada no método onResponse() de Callback<UsuarioModel>.

Sendo assim, em onResponse(), trabalhe o erro dando uma resposta adequada ao usuário.

A resposta pode estar no JSON devolvido pelo backend Web ou, com o código de erro de autenticação, o seu script pode então apresentar uma Toast mensagem de aviso ao usuário sobre o problema.

Uma dica de melhoria para o seu projeto: isole todos os algoritmos de conexão remota em outra classe. Ou seja, outra camada da aplicação.

O seu código atual está misturando código de interface de usuário (tudo que está na atividade e no layout dela) com código de lógica de negócio e dados (todo o algoritmo Retrofit).

Bom, é isso.

Surgindo mais dúvidas, pode enviar.

Abraço.
Responder
Guilherme (1) (0)
28/09/2018
E ai Thiengo, tudo bem?
Cara, gostaria de saber uma coisa. Ao assistir o video fiquei com uma dúvida..
Quando na minha requisição, eu preciso retornar uma lista de um objeto qualquer e um dos atributos desse objeto, também é um objeto, eu entendi que precisaria usar o JsonDeserializer, correto?
Consegue me mostrar um exemplo de como seria a estrutura dessa classe?
Porque no meu onResponse eu estou tendo um erro.
Responder
Vinícius Thiengo (0) (0)
29/09/2018
Guilherme, tudo bem aqui.

O conteúdo do link a seguir provavelmente vai lhe ajudar com isso, apresentando um exemplo até mesmo com um Deserializer customizado:

https://medium.com/@andersonk/retrofit-2-custom-deserializer-for-unwrapping-properties-8cb8b2ec901e

O conteúdo está em inglês, mas é pequeno e fácil de entender. Se mesmo com ele você não conseguir prosseguir, volte aqui.

Abraço.
Responder
Guilherme (1) (0)
01/10/2018
Thiengo, estou sinceramente bem confuso para resolver esse meu problema.
A lista que eu tenho é essa:

[{"codigo_balada":24,"nome":"Balada Vamos","descricao":"LaLaLa","reputacao":null,"banner":null,"thumbnail":null,"endereco":{"codigo_endereco":5550,"logradouro":"Rua Joia General'","numero":3189218,"bairro":"ioidosa","cidade":"UHU","estado":"mid","cep":"398391893"},"genero":{"codigo_genero":50,"nome":"Rock"}},{"codigo_balada":25,"nome":"ds","descricao":"ds","reputacao":null,"banner":null,"thumbnail":null,"endereco":{"codigo_endereco":5601,"logradouro":"sw","numero":312,"bairro":"da","cidade":"w","estado":"w","cep":"w"},"genero":{"codigo_genero":150,"nome":"Sertanejo"}}]

O erro objtido é que isso isso não é um array, ou seja, usei o deserializer de maneira errada...
Responder
Vinícius Thiengo (0) (0)
14/10/2018
Guilherme,

Com a mensagem de erro informada é possível concluir que o seu problema ainda não é o deserializer e sim a maneira que você está lendo o array retornado pelo backend.

O código do link a seguir é um exemplo simples de como trabalhar a leitura de array JSON no Retrofit, utilize a sintaxe de List como no código de exemplo:

https://stackoverflow.com/a/42623695/2578331

Para um teste inicial, ignore os tipos "endereco" e "genero" do seu JSON de teste, pois esses sim terão de ser deserializados por uma classes customizada. Se possível, remova esses tipos de seu JSON de teste.

Guilherme, o primeiro objeto com o seu código é conseguir ler o array JSON no Retrofit. Feito isso, volte com os tipos "endereco" e "genero" e aplique o código deserializer do link que indiquei na primeira mensagem de resposta.

Abraço.
Responder
Anderson (1) (0)
04/08/2017
Vinicius td bem? Estou estudando a retrofit agora, estava usando volley. A versão da Retrofit agora é 2.3.0 refazendo seu exemplo em Send Header estou tendo problemas para criar o Interceptor, recebo uma exception java.lang.UnsupportedOperationException nessa linha okHttpClient.interceptors().add(interceptor);
Responder
Vinícius Thiengo (0) (0)
06/08/2017
Anderson, tudo bem aqui.

Desde a versão 2.0 algumas coisas realmente mudaram.

Como ainda não enfrentei este problema, busquei por alguma solução caso outra pessoa tenha o encontrado, achei está: https://stackoverflow.com/a/34678380/2578331

Veja se com ela consegue prosseguir, caso não, volte a aqui com o URL PasteBin (https://pastebin.com/ ) do código que contém o trecho do Interceptor para que eu possa estuda-lo por inteiro. Abraço.
Responder
11/04/2017
Gostaria de saber como tratar erros que são retornados em json, tento pegar o errorBody do response, mas não consigo pegar o json retornado.
Responder
Vinícius Thiengo (0) (0)
13/04/2017
Ronie, tudo bem?

Nesse caso o algoritmo do response deve tratar o acesso ao erro como acesso a um resultado bem sucedido, pois o JSON está sendo retornado.

Tentou acessando o "body" apenas? Ou nenhum dados está sendo retornado?

Neste último caso o problema, muito provavelmente, está em seu backend Web. Se for um PHP, ligue todos os erros, notices e warning com o código ini_set(?display_errors?, 1) e execute o aplicativo via navegador Web para poder ver os problemas e corrigi-los. Abraço.
Responder
Leonardo (1) (0)
07/02/2017
Ola, vc sabe qual é a API Android minima para o retrofit funcionar perfeitamente?
Responder
Vinícius Thiengo (0) (0)
07/02/2017
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
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
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
Show ... :)
Responder
Ruan Alves (1) (0)
27/11/2016
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
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
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
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
Opa Show ... Vou verificar, qualquer dúvida eu retorno ...
Responder
16/08/2016
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
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
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)
01/08/2016
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
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
Vlw Diego, abraço
Responder
Matheus Bed (1) (0)
08/04/2016
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
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
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
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
Santos (1) (0)
26/03/2016
Thiengo boa noite curto muito seu canal, as videos aulas são excelente.
Estou com uma duvida em uma chamada de Api usando retrofit
Estou chamado essa api:
http://api.olhovivo.sptrans.com.br/v0/Login/Autenticar?token=e7ee814554ad03ec152dd96c28af3d08bd0775c5663d7936d55351ded6dc4e79

Erro:
Response{protocol=http/1.1, code=404, message=Not Found, url=http://api.olhovivo.sptrans.com.br/Login/Autenticar?token=bb46020bb8e903ee0ad2bea968abf4d656096a402673621ec75dc5e9c443aec4}

Porem usando esse cara:
https://www.getpostman.com/
retorna sucesso.

Obrigado
Responder
Vinícius Thiengo (0) (0)
26/03/2016
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
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
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
Como explicado no comentário logo depois desse, vc já resolveu. Abraço
Responder
Wanderson (1) (0)
01/02/2016
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
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
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
a pergunta que não quer calar...retrofit 2 ou volley thiengo
Responder
Vinícius Thiengo (1) (0)
09/01/2016
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
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
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
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
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
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
Excelente vídeo!!
Quando puder publica um com o backend.
Abraço!
Responder
Pietro (1) (0)
15/10/2015
Boa, Thiengo! vlw por mais esse vídeo!
Responder
Diones da Silva Camargo (1) (0)
14/10/2015
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
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
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
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
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
Essa Lib Retrofit 2 é melhor que o Volley ??
Responder
Vinícius Thiengo (0) (0)
13/10/2015
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)
12/10/2015
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
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
Bom dia, sugiro o PostgreSQL, pois a cada dia tem se tornado referencia em SGBD Open Source.
Responder