1
resposta

Obter o retorno no onResponse do okhttp

Boa tarde profs. eu tenho uma chamada utilizando o okhttp3, eu sei que foi abordado o retrofrit, mas precisei usar ookhttp sem ele, é possivel eu obter o resultado do onResponse sem que ele volte como nulo para metodo original, porque o meu problema é que como nao aguarda o resultado da operação asincrona, eu obtenho valores nulos, e quando ele volta para onResponse, ele nao retorna para o metodo original com os valores obtidos da api, como eu poderia resolver isso ?

private void pegarDevice() {
        //pegar device
        try {
            ResultCommunic<DeviceCadastrado> device = getDevice.pegarDevice();
            if(device.Sucesso()){
                carregarDadosDoDevice(device.Valor);
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
 @RequiresApi(api = Build.VERSION_CODES.N)
    private <TResult> ResultCommunic<TResult> _Command(ECommunicAcao pAcao, Object pObjeto, Boolean pRec){
        final ResultCommunic<TResult>[] vRetorno = new ResultCommunic[]{new <TResult>ResultCommunic()};
        ResultCommunic<TokenResult> vToken = null;

        //Referencia https://www.vogella.com/tutorials/JavaLibrary-OkHttp/article.html
        //https://square.github.io/okhttp/
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(logging)
                .retryOnConnectionFailure(true)
                .addInterceptor(new AcceptLanguageHeaderInterceptor())
                .readTimeout(15, TimeUnit.SECONDS)
                .writeTimeout(15, TimeUnit.SECONDS)
                .build();
        Request.Builder builder = new Request.Builder();
        Response response = null;

        //Token
        if(_UseToken){
            vToken = _TokenWebDbCommunic.GetTokenAsync(pRec);
           if(!vToken.Sucesso()){
                vRetorno[0].Mensagem = vToken.Mensagem;
                vRetorno[0].Resultado = vToken.Resultado;
                return vRetorno[0];
            }
        }
        //Adicionar o token nas request
        builder.addHeader("Authorization", "Bearer " + vToken.Valor.getAccess_token());
        Gson gson = new Gson();
        switch (pAcao) {
            case Enviar:
                break;
            case Recebe:
                builder.url(MontaURI((String) pObjeto)).get();
                //Request requestGet = builder.build();
                //client.newCall(builder.build()).enqueue(requestGetAsync(vRetorno));
                client.newCall(builder.build()).enqueue(new Callback() {
                    @Override
                    public void onFailure(@NotNull Call call, @NotNull IOException e) {
                        new Thread(() -> {
                            // For the example, you can show an error dialog or a toast
                            // on the main UI thread
                        });
                    }

                    @Override
                    public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
            GOSTARIA DE RETORNAR O RESULTADO DO ONRESPONSE
                        if(response.isSuccessful()){
                            if(response.code() == HttpURLConnection.HTTP_OK){
                                vRetorno[0] = gson.fromJson(response.body().string().replace("valor", "Valor"), ResultCommunic.class);
                                vRetorno[0].Resultado = Resultado.Sucesso;
                            }else{
                                vRetorno[0].Mensagem = "Servidor não encontrado";
                                vRetorno[0].Resultado = Resultado.NaoEncontrado;
                            }
                        }
                    }
                });
                break;
            case Excluir:
                builder.url(MontaURI((String) pObjeto)).delete();
                //response = client.newCall(builder.build()).execute();
                break;
            default:
                builder.url(MontaURI());
                //MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
                //Gson gson = new Gson();
                //gson.toJson(pObjeto);
                //RequestBody body = RequestBody.create(mediaType, gson.toString());
                builder.post(null);
                //response = client.newCall(builder.build()).execute();
        }
        return vRetorno[0];
    }
1 resposta

Oi Renata, tudo bem? Eu não usei o Okhttp3 sem o Retrofit, mas acredito que boa parte, ou provavelmente tudo, seja possível de fazer apenas com ele. Porém, eu fiquei em dúvida no que vc precisa de ajuda:

  • Você quer fazer uma requisição e verificar apenas se ela deu certo sem pegar o retorno e transformar de json para objeto?
  • Você quer fazer uma requisição, dando certo ou não, quer pegar a resposta e transformar em objeto?

Se for algo diferente, tente específicar cada passo para e tentar identificar uma possível maneira de implementar. Também, tente me passar mais detalhes da logging interceptor quando vc faz a requisição, isso é muito importante para saber o motivo do problema.

[]s

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software