Модифицированная очередь вызовов не достигает onResponse или onFailure - PullRequest
0 голосов
/ 12 апреля 2019

Я знаю, что это общий вопрос, но я все их сделал, но до сих пор не решен.В моей 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;

Ошибка - это returnValue возвращает ноль.Я пробовал отладку, но даже она не доходит до ответа.Я знаю, что проблема должна быть в том, что .enqueue асинхронный, но как я могу решить эту проблему и вернуть запрос в mainActivity ?

config 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"}

1 Ответ

0 голосов
/ 12 апреля 2019

Вы можете передавать обратные вызовы из вашего 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);
}
...