Retrofit2. Возвращаемое значение body == null

191
14 апреля 2017, 20:51

Не могу понять, в чем ошибка. Путем дебаггинга понял, что в итоге body = null.

{
      "RequestId":"13fb3f4b-d801-4c3c-a9e5-908757678074",
      "TimeStamp":"2011-09-09T23:31:53.102Z",
      "Status":"PNE",
      "Errors":null,
      "EndTimestamp":"2011-09-09T23:31:53.102Z",
      "Build":"9.1.6.10",
      "ChannelLineup":{
         "ServiceId":20494,
         "Name":"Los Angeles Area Channels - Los Angeles Area Broadcast",
         "City":"Los Angeles",
         "Type":"Broadcast",
         "MSO":"Data Services Product",
         "MSOID":"301530",
         "TimeZones":[
            {
               "StartDateTime":"2011-03-13T10:00:00Z",
               "EndDateTime":"2011-11-06T09:00:00Z",
               "Offset":-420
            }
         ],
         "Channels":[
            {
               "SourceId":11110,
               "Channel":"2.1",
               "CallLetters":"KCBSHD",
               "DisplayName":"KCBSHD",
               "SourceType":"Broadcast",
               "Type":"24-Hours",
               "Order":1,
               "TiVoSupported":true,
               "ParentNetworkId":2,
               "IconAvailable":true,
               "FullName":"KCBS HDTV",
               "VirtualChannelNumber":"2.1",
               "Affiliation":2165,
               "ServiceType":"Digital",
               "SourceAttributes":"1",
               "ChannelSchedules":null,
               "SourceAttributeTypes":[
                  "HD"
               ],
               "ChannelLocation":"",
               "DvbTriplets":null
            },
            {
               "SourceId":11287,
               "Channel":"4.1",
               "CallLetters":"KNBCHD",
               "DisplayName":"KNBCHD",
               "SourceType":"Broadcast",
               "Type":"24-Hours",
               "Order":2,
               "TiVoSupported":true,
               "ParentNetworkId":5,
               "IconAvailable":true,
               "FullName":"KNBC HDTV",
               "VirtualChannelNumber":"4.1",
               "Affiliation":1209,
               "ServiceType":"Digital",
               "SourceAttributes":"1",
               "ChannelSchedules":null,
               "SourceAttributeTypes":[
                  "HD"
               ],              
               "ChannelLocation":"",
               "DvbTriplets":null
            }
         ]
      }
}

Класс Main

public class Main {
    private static final String API_URL = "http://api.rovicorp.com";
    private static final String API_KEY = "dekq58hngayqn3jtdb4q4qnw";
    public static void main(String[] args) throws IOException {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(API_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        RovicorpApi rovicorpApi = retrofit.create(RovicorpApi.class);
        Call<ServiceDetailsResult> call = rovicorpApi.getData("en-US", false, API_KEY);
        ServiceDetailsResult result = call.execute().body();
        if(result != null) {
            List<Channel> channels = result.getChannelLineup().getChannels();
            for (Channel channel : channels) {
                System.out.println(channel.getFullName());
            }
        }
        else System.out.println("Error!");
    }
}

Класс Channel

public class Channel {
    @SerializedName("SourceId")
    @Expose
    private Integer sourceId;
    @SerializedName("Channel")
    @Expose
    private String channel;
    @SerializedName("CallLetters")
    @Expose
    private String callLetters;
    @SerializedName("DisplayName")
    @Expose
    private String displayName;
    @SerializedName("SourceType")
    @Expose
    private String sourceType;
    @SerializedName("Type")
    @Expose
    private String type;
    @SerializedName("Order")
    @Expose
    private Integer order;
    @SerializedName("TiVoSupported")
    @Expose
    private Boolean tiVoSupported;
    @SerializedName("ParentNetworkId")
    @Expose
    private Integer parentNetworkId;
    @SerializedName("IconAvailable")
    @Expose
    private Boolean iconAvailable;
    @SerializedName("FullName")
    @Expose
    private String fullName;
    @SerializedName("VirtualChannelNumber")
    @Expose
    private String virtualChannelNumber;
    @SerializedName("Affiliation")
    @Expose
    private Integer affiliation;
    @SerializedName("ServiceType")
    @Expose
    private String serviceType;
    @SerializedName("SourceAttributes")
    @Expose
    private String sourceAttributes;
    @SerializedName("ChannelSchedules")
    @Expose
    private Object channelSchedules;
    @SerializedName("SourceAttributeTypes")
    @Expose
    private List<String> sourceAttributeTypes = null;
    @SerializedName("ChannelLocation")
    @Expose
    private String channelLocation;
    @SerializedName("DvbTriplets")
    @Expose
    private Object dvbTriplets;
/* getters and setters */     
}

Класс ChannelLineup

public class ChannelLineup {
    @SerializedName("ServiceId")
    @Expose
    private Integer serviceId;
    @SerializedName("Name")
    @Expose
    private String name;
    @SerializedName("City")
    @Expose
    private String city;
    @SerializedName("Type")
    @Expose
    private String type;
    @SerializedName("MSO")
    @Expose
    private String mSO;
    @SerializedName("MSOID")
    @Expose
    private String mSOID;
    @SerializedName("TimeZones")
    @Expose
    private List<TimeZone> timeZones = null;
    @SerializedName("Channels")
    @Expose
    private List<Channel> channels;
/* getters and setters */     
}

Интерфейс RovicorpApi

public interface RovicorpApi {
    @Headers("X-Originating-Ip: 212.92.190.116")
    @GET("/TVlistings/v9/listings/servicedetails/serviceid/20494/info")
    Call<ServiceDetailsResult> getData(@Query("locale") String locale,
                         @Query("includechannelimages") boolean channelImages,
                         @Query("apikey") String apikey);
}

Класс ServiceDetailsResult

public class ServiceDetailsResult {
    @SerializedName("RequestId")
    @Expose
    private String requestId;
    @SerializedName("TimeStamp")
    @Expose
    private String timeStamp;
    @SerializedName("Status")
    @Expose
    private String status;
    @SerializedName("Errors")
    @Expose
    private Object errors;
    @SerializedName("EndTimestamp")
    @Expose
    private String endTimestamp;
    @SerializedName("Build")
    @Expose
    private String build;
    @SerializedName("ChannelLineup")
    @Expose
    private ChannelLineup channelLineup;
/* getters and setters */     
    public void setChannelLineup(ChannelLineup channelLineup) {
        this.channelLineup = channelLineup;
    }
    public ServiceDetailsResult withChannelLineup(ChannelLineup channelLineup) {
        this.channelLineup = channelLineup;
        return this;
    }

Класс TimeZone

public class TimeZone {
    @SerializedName("StartDateTime")
    @Expose
    private String startDateTime;
    @SerializedName("EndDateTime")
    @Expose
    private String endDateTime;
    @SerializedName("Offset")
    @Expose
    private Integer offset;
/* getters and setters */     
}
Answer 1

Проверь код ответа в response который возвращается при вызове call.execute(). И потом уже вытягивай body. Возможно при запросе происходит ошибка и поэтому body == null.

READ ALSO
Не возвращаются значения с нитей

Не возвращаются значения с нитей

Скажите, пожалуйста, в чем ошибка? После отработки кода resultMap хранит всего одно значение с первой нити, почему не добавляются значения с других...

168
Retrofit request

Retrofit request

Подскажите пожалуйста где в Retofit можно посмотреть url запроса, с ключами, обязательными параметрами и тп

209
Влияют ли sleep() или wait() в момент вызова, на флаг isInterrupted() или нет?

Влияют ли sleep() или wait() в момент вызова, на флаг isInterrupted() или нет?

Если я приостанавливаю поток при помощи методов sleep() или wait(), флаг isInterrupted() в этот момент меняется или нет?

190
Обращение к элементу RecyclerView.ViewHolder из AsyncTask

Обращение к элементу RecyclerView.ViewHolder из AsyncTask

Я создал определенный view элемент, код ниже:

170