Получение тела ответа в Retrofit2, но onResponse не вызывается

Я получаю тело от моего вызова API, но onResponse() не вызывается, вот методы:

final Rest_manager_league rest = new Rest_manager_league();
Call<List<Root>> listCall = rest.getMLeague_conn().getLeague(x);
listCall.enqueue(new Callback<List<Root>>() {
    @Override
    public void onResponse(Call<List<Root>> call, Response<List<Root>> response) {
        lg = response.body();
        Log.d("res", "ON");
        if (response.isSuccessful()){
            textView.setText(lg.get(3).getStanding().get(2).getTeamName());
            Log.d("s", "true");
        }
    }

    @Override
    public void onFailure(Call<List<Root>> call, Throwable t) {
        Log.d("Failure", "Failed");
    }
});

Вот интерфейс модернизации и сервис:

public interface league_Conn {
    @GET("/v1/soccerseasons/{id}/leagueTable")
    @Headers("X-Auth-Token:" +
            "1869f69f772b40a2a12fd6eefb4e48ef ")
    Call<List<Root>> getLeague(@Path("id") int id);
}

public class Rest_manager_league {
    private league_Conn mleague_conn;

    public league_Conn getMLeague_conn() {

        if (mleague_conn == null) {

            HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
            logging.setLevel(HttpLoggingInterceptor.Level.BODY);
            OkHttpClient client = new OkHttpClient.Builder().addInterceptor(logging).build();
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://api.football-data.org/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(client)
                    .build();
            mleague_conn = retrofit.create(league_Conn.class);

        }


        return mleague_conn;
    }
}

В логарифме появляется onFailure(). Вот так:

okhttp3 <-- END HTTP (8300 byte body) Failer :Failed

Почему onResponse() не звонят?


person Hassan Raza    schedule 16.05.2016    source источник
comment
используйте Throwable t, чтобы показать подробности ошибки   -  person Yazan    schedule 16.05.2016
comment
После того, как вы это сделаете, опубликуйте трассировку стека. Спасибо!   -  person Monica Aspiras Labbao    schedule 16.05.2016
comment
Ожидается BEGIN_ARRAY, но было BEGIN_OBJECT   -  person Hassan Raza    schedule 16.05.2016


Ответы (1)


arrow_upward
4
arrow_downward

Вы получаете тело ответа (8300 байт), но onFailure вызывается, потому что ваше возвращенное тело не согласуется с вашим GSONFactory. Процесс десериализации не работал. Вы можете точно определить проблему, распечатав трассировку стека, как указал @yazan. Просто введите:

t.printStackTrace()

in onFailure().

Изменить:

Ошибка возникает из-за того, что вы сообщаете Retrofit, что ожидаете список, но вместо этого получаете объект JSON. Я быстро взглянул на API, который вы используете, и похоже, что он возвращает объект JSON, а возвращенный объект содержит список, к которому вы хотите получить доступ. Попробуйте заменить экземпляры List<Root> только на Root. Для получения дополнительной помощи вы также можете проверить этот вопрос:

GSON выдает ожидаемый BEGIN_ARRAY, но была ошибка BEGIN_OBJECT

person Daniel    schedule 16.05.2016
comment
W/System.err: java.lang.IllegalStateException:ExpectedBEGIN_ARRAY, но был BEGIN_OBJECT в строке 1, столбце 2, пути $ 05-16 20:47:17.782 23099-23099/com.example.dell.project_practise4 W/System.err:at com .google.gson.stream.JsonReader.beginArray(JsonReader.java:350) 05-16 20:47:17.782 23099-23099/com.example.dell.project_practise4 W/System.err: на com.google.gson.internal .bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80) 05-16 20:47:17.782 23099-23099/com.example.dell.project_practise4 - person Hassan Raza; 16.05.2016
comment
Да, вы абсолютно правы, этот трассировщик почти решил мою проблему. - person Hassan Raza; 16.05.2016
comment
Когда я столкнулся с этой проблемой, мне пришлось много искать, чтобы обнаружить источник. Поэтому, чтобы помочь коллегам-разработчикам быстро найти этот ответ, я предлагаю вам изменить заголовок вопроса на что-то более описательное, например, Получение тела ответа в Retrofit2, но onResponse не вызывается. Это довольно просто, если вы знаете, что onFailure вызывается, потому что десериализация не сработала. Однако поиск этой части информации занял у меня довольно много времени на поиски. - person Daniel; 17.05.2016