Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Converter Response() para Callback()

Gostaria de converter os meus serviços de Response() para Callback() mas estou enfrentando algumas dificuldades já que possui retornos e variáveis que não é possível transformar em final. Segue um exemplo de método que estou querendo converter:

private static Login autenticaNaApi(String usuario, String senha, Context context, UsuarioRepository repository) throws Exception
    {
        LoginRequest req = new LoginRequest();
        req.setDeviceimei(AndroidUtils.getImei(context));
        req.setUsername(usuario);
        req.setPassword(senha);

        Response<LoginResponse> response = getService().login(req).execute();

        if (!response.isSuccessful())
        {
            return new Login(USUARIO_SENHA_INCORRETOS);
        }

        LoginResponse success = response.body();
        Usuario user = HolderUtils.holderToUsuario(success.getUsuario());
        user.setToken(success.getToken());
        repository.saveUsuario(user);

        return new Login(user);
    }
3 respostas

Oi Osmar, tudo bem?

Estou em dúvida sobre o problema que está tendo. Primeiro você mencionou que está tentando converter a requisição para que lide com Callback ao invés do Response. Para isso, você precisa executar o enqueue().

Se o problema está em usar o enqueue(), qual é o motivo exatamente? Você mencionou que existe possibilidades múltiplas de retorno, então significa, por exemplo, que o retorno da API pode retornar um objeto quando dá certo (no caso o LoginResponse) e outro quando dá erro?

Preciso de mais detalhes do fluxo para que eu consiga entender com mais facilidade os problemas.

[]s

Olá Alex,

Então o problema e justamente no retorno, como o onResponse "retorna" void eu não consigo/posso colocar retorno dentro. A minha duvida é como usar o tratamento da requisição (usando Callback) e também conseguindo dar retorno. Caso tenha sugestão também de melhora de código é bem vindo. Segue o código atualizado, mas com problema no retorno (<--):

private static Login autenticaNaApi(String usuario, String senha, Context context, UsuarioRepository repository) throws Exception
    {
        LoginRequest req = new LoginRequest();
        req.setDeviceimei(AndroidUtils.getImei(context));
        req.setUsername(usuario);
        req.setPassword(senha);

        Call<LoginResponse> call = getService().login(req);

        call.enqueue(new Callback<LoginResponse>()
        {
            @Override
            public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response)
            {
                if (!response.isSuccessful())
                {
                    return new Login(USUARIO_SENHA_INCORRETOS); <---
                }

                LoginResponse success = response.body();
                Usuario user = HolderUtils.holderToUsuario(success.getUsuario());
                user.setToken(success.getToken());
                repository.saveUsuario(user);

                return new Login(user); <---
            }

            @Override
            public void onFailure(Call<LoginResponse> call, Throwable t)
            {

            }
        });
    }

Entendi, no caso do Callback, trabalhamos com notificações, pois são situações que não tem um tempo determinado para finalizar. Essas notificações podem ser chamadas similares a listeners ou eventos, como é o caso do EventBus.

Caso nunca tenha implementado um listener, ele é feito a partir de uma interface, eu mostro como é possível criar um listener próprio no curso de RecyclerView que exige esse tipo de implementação.

[]s