【问题标题】:Retrofit call enqueue doesn't reach onResponse or onFailure改造调用队列未达到 onResponse 或 onFailure
【发布时间】:2019-04-13 00:46:39
【问题描述】:

我知道这是一个常见的问题,但我做了所有这些,仍然没有解决。在我的 MainActivity 中,我收到了来自 ServerService.java 的调用,如下所示:

String randomNumber = serverService.contactServer();

ServerService.java中,contactServer()会调用包含.enqueue的方法:

  public String contactServer() {     
    return requestServerService();
}

requestServerService() 包含代码:

 public String requestServerService() {

    Call<RequestAttributes> call = new RetrofitConfig().getServiceRequester().requestRandomNumber();

    call.enqueue(new Callback<RequestAttributes>() {
        @Override
        public void onResponse(Call<RequestAttributes> call, Response<RequestAttributes> response) {
            if (!response.isSuccessful()) {
                Log.i("Err", "Err: " + response.code());
            } else {
                RequestAttributes requestAttributes = response.body();
                returnedValue = requestAttributes.getRandomNumber();
                Log.d("jsonAnswer", "O numero aleatorio é: " + returnedValue);
            }
        }

        @Override
        public void onFailure(Call<RequestAttributes> call, Throwable t) {
            Log.e("Fail", "Failed: " + t.getMessage());
        }
    }); return returnedValue;

errorreturnedValue 返回 null。我尝试调试,但即使它没有达到 onReponse。我知道问题一定是因为 .enqueue 是异步的,但是我该如何解决这个问题并将请求返回给 ma​​inActivity

Retrofit 的配置

  public RetrofitConfig() {

    this.retrofit = new Retrofit.Builder()
                    .baseUrl("localhost:3000/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

}

public ServiceRequester getServiceRequester() {
    return this.retrofit.create(ServiceRequester.class);
}

POJO

public class RequestAttributes {


@SerializedName("randomNumber")
private String randomNumber;

public String getRandomNumber() {
    return randomNumber;
}

public void setRandomNumber(String randomNumber) {
    this.randomNumber = randomNumber;
}

@Override
public String toString() {
    return "RequestAttributes{" +     
            ", randomNumber='" + randomNumber + '\'' +
            '}';
}

}

请求

 @GET("api/requestRandomNumber")
 Call<RequestAttributes> requestRandomNumber();

如果我通过浏览器请求,JSON 答案

{"randomNumber":"u845gq"}

【问题讨论】:

  • 显示你的反手json是什么?
  • 分享你的基本 url 类
  • 你遇到了什么错误?
  • 你的基本网址是什么
  • @JoãoVitorBrasil 这与回调无关。当您调用 enqueue 改造时,在另一个线程中执行调用,因此 return 语句 return returnedValue; 将始终返回初始值,在您的情况下为 null

标签: java android retrofit


【解决方案1】:

您可以将回调从您的 MainActivity 传递给 contactServer() 方法

        serverService.contactServer(new Callback<RequestAttributes>() {
        @Override
        public void onResponse(Call<RequestAttributes> call, Response<RequestAttributes> response) {
            if (!response.isSuccessful()) {
                Log.i("Err", "Err: " + response.code());
            } else {
                RequestAttributes requestAttributes = response.body();
                String returnedValue = requestAttributes.getRandomNumber();
                // Do what you want here with returnedValue. You are in the activity thread(MainThread or UIThread) for example someTextView.setText(returnedValue);
                Log.d("jsonAnswer", "O numero aleatorio é: " + returnedValue);
            }
        }

        @Override
        public void onFailure(Call<RequestAttributes> call, Throwable t) {
            Log.e("Fail", "Failed: " + t.getMessage());
        }
    });

然后做成void方法,把回调传给requestServerService()方法

public void contactServer(Callback<RequestAttributes> callback) {
    requestServerService(callback);
}

然后像这样实现requestServerService()方法:

public void requestServerService(Callback<RequestAttributes> callback) {

    Call<RequestAttributes> call = new RetrofitConfig().getServiceRequester().requestRandomNumber();

    call.enqueue(callback);
}

【讨论】:

  • 太棒了,它成功了!太感谢了!还有一个问题:是否可以在 serverService 类中进行回调?
  • 如何将returnedValue设置为全局变量?
  • 你可以在onResponse()方法中做到这一点
  • 我试过这个,但我无法在另一个类中获取值。这可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2020-07-04
相关资源
最近更新 更多