Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

SwipeRefreshLayout com retrofit

Professor, quando tento utilizar o onRefresh (no onCreate) chamando um método com o retrofit, o swipe da um freeze, não fica carregando até a busca dos dados terminar, tudo funciona, porém ele para e depois que termina ele some. O onResponse e o OnFailure são executados na Main Thread, certo? Tem como fazer essa "busca" no servidor em background e manter o layout do swipe até ele concluir a busca, com o retrofit?

3 respostas

Oi Felipe, blz?

Sobre os métodos de callback. Sim, eles são executados na main UI thread da aplicação. Porém, apenas para casos do Android.

Entretanto, você pode configurar o builder do retrofit para ele usar uma thread paralela por meio do método callbackExecutor enviando o parâmetro Executors.newSingleThreadExecutor():

        retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.65.40:8080/api/")
                .addConverterFactory(JacksonConverterFactory.create())
                .callbackExecutor(Executors.newSingleThreadExecutor())
                .client(client.build())
                .build();

Ao usar essa abordagem, tenha consciência de que tudo que você for rodar com o Retrofit nessa configuração não vá mexer com nada que envolva a UI do Android, pois vai quebrar a aplicação. No geral, é algo bem arriscado e tende a dar dor de cabeça...

Mas nada impede de você, por exemplo, criar dois construtores, um para usar a configuração padrão que é para a thread da UI application e outra para essa thread separada.

Sobre a parte do swipe: Pelo o que eu entendi você quer deixar o swipe aparecendo mesmo se sair da activity, certo? Se for isso, o swipe vai ficar aparecendo da mesma forma, exceto se chegar no estado de onDestroy, pois nesse caso a activity que criou o swipe vai deixar de existir, logo o swipe vai morrer também.

Você pode até testar esse comportamento colocando a parada do swipe dentro de um postDelayed do Handlerque explico no curso 3.

new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                // implementação que remove a animação do swipe
            }

        }, 30000);

Nesse código o tudo que estiver dentro do run vai ser executado depois do tempo configurado, no caso 30000 que está em milissegundos, ou seja, 30 segundos. Dessa forma é possível de ver quando o swipe fica ou sai da aplicação :)

Caso tiver alguma dúvida é só avisar. Espero ter ajudado.

[]s

Alex, obrigado pelo feedback!

Então, no caso dentro do onRefresh eu chamo um método. Esse método faz a requisição GET e me retorna uma lista. O problema é que dentro do onResponse eu pego essa lista é gravo no bd e logo após eu carrego essa lista. Tudo isso ocorre normalmente, porém o layout do swipe congela e após terminar toda essa execução ele some normal, eu queria que ele girasse até concluir e nao que congelasse. Não testei suas sugestões ainda, vou testar para verificar.

solução!

Oi Felipe,

Esse comportamento é estranho, o swipe deveria sair sem nenhum problema. Apenas para ressaltar, tenha certeza que o método setRefreshing() está sendo enviado com o parâmetro false para desativar o swipe.

Se preferir, pode enviar o código que posso dar uma olhada em algum ponto que pode estar implicando nesse resultado.

E de nada! Precisando é só avisar :)

[]s