Результат исчез в модификации 2.4.0 - PullRequest
0 голосов
/ 30 июня 2018

Я хочу использовать модификацию для получения данных с моего сервера. Мой сервер отправляет данные в виде строки json. Я создаю сервер, как это:

public class ServiceGenerator {

    public static final String BASE_URL = "http://192.168.100.73/ChartReport/Service1.svc/";


    static OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(1, TimeUnit.MINUTES)
            .readTimeout(30, TimeUnit.SECONDS)
            .writeTimeout(15, TimeUnit.SECONDS)
            .build();

    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(okHttpClient)
                    .addConverterFactory(GsonConverterFactory.create());

    private static Retrofit retrofit = builder.build();

    public static <S> S createService(Class<S> serviceClass) {
        return retrofit.create(serviceClass);
    }
}

А потом я создал клиента, как удар:

public interface IReportCLient {
    @POST("json/GetDataReport")
    Call<ResponseBody> getReporst();
}

И я использовал в своей деятельности:

IReportCLient service = ServiceGenerator.createService(IReportCLient.class);
Call<ResponseBody> reporst = service.getReporst();

reporst.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        try {
            JsonObject post = new JsonObject().get(response.body().string()).getAsJsonObject();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

    }
});

Когда я запускаю свое приложение в режиме отладки в первый раз, я получаю свои данные этой командой: response.body().string() но сразу мой результат становится нулевым, когда я снова запускаю response.body().string() ?? enter image description here

Что происходит?

1 Ответ

0 голосов
/ 30 июня 2018

string() метод может быть вызван только один раз на RequestBody. Так что он вернет пустую строку, если вы попытаетесь вызвать ее снова. Это верно и для отладки. Если вы попытаетесь оценить выражения response.body().string() во время отладки, ваши фактические методы получат пустую строку.

HTTP-ответ. Экземпляры этого класса не являются неизменяемыми: Тело ответа - одноразовое значение, которое может быть использовано только один раз и затем закрыто. Все остальные свойства неизменны. https://square.github.io/okhttp/3.x/okhttp/okhttp3/Response.html

Прочтите также https://stackoverflow.com/a/32307866/6168272

Вот как я получаю JsonObject от моего объекта ответа. Вы можете попробовать.

private JSONObject parseJsonFromResponse(Response response) {
            ResponseBody responseBody = response.body();
            if (responseBody != null) {
                try {
                    return new JSONObject(responseBody.string());
                } catch (JSONException | IOException e) {
                    e.printStackTrace();
                    return new JSONObject();
                }
            } else return new JSONObject();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...