Onresponse не будет выполняться при вызове данных с модификацией

Я пытаюсь вызвать данные с помощью Retrofit, но у меня проблема из-за того, что мой метод внутри callBack () не будет выполняться (выполняется onResponse, но выполняется onFailure), что не так с моим кодом? Заранее спасибо.

Вот когда я звоню по поводу модернизации:

 private void checkSubscription() {
    Call<APIResponse<List<DataStatusSubscribe>>> call = ServicesFactory.getService(this).getStatusSubscribe(own.msisdn);
    call.enqueue(new Callback<APIResponse<List<DataStatusSubscribe>>>() {

        // ======== This method won't execute ===========
        **@Override
        public void onResponse(Call<APIResponse<List<DataStatusSubscribe>>> call, Response<APIResponse<List<DataStatusSubscribe>>> response) {
            if (response.isSuccessful() && response.body().isSuccessful()){
                List<DataStatusSubscribe> dataStatusSubscribes = response.body().data;
                String status = dataStatusSubscribes.get(dataStatusSubscribes.size()-1).getStatus();
                if (status.equals("0")){
                    showPopupSubscribe();
                }
            }**


        }
      // ======== This method won't execute ===========
        @Override
        public void onFailure(Call<APIResponse<List<DataStatusSubscribe>>> call, Throwable t) {

        }
    });

}

Вот моя структура данных JSON:

    {
    "code": 200,
    "error_message": null,
    "data": [
        {
            "ID": "6917",
            "msisdn": "2013304044",
            "operator_id": "3",
            "service": "AB3",
            "status": "0",
            "apps_status": "0",
            "sub_start": "2018-04-10 16:48:28",
            "sub_end": "2018-04-10 16:59:50",
            "renewal": "0000-00-00"
        }
    ]
}

Вот мой ответ APIR:

public class APIResponse<T> extends BaseResponse {
    public T data;
}

Вот мой BaseResponse:

public abstract class BaseResponse {
    @SerializedName("code")
    public String code;


public boolean isSuccessful(){
    if(code.equalsIgnoreCase("200")){
        return true;
    }
    return false;
  }
}

Это ServiceFactory.java:

public class ServicesFactory {
private static boolean ENABLE_LOGGING = BuildConfig.DEBUG;
private static String BASE_URL = "http://abc/def/";

public static Services getService(Context context) {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(generateClient(context))
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    return retrofit.create(Services.class);
}

private static OkHttpClient generateClient(Context context) {
    OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
            .connectTimeout(60, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS);

    if (ENABLE_LOGGING) {
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        clientBuilder.addInterceptor(loggingInterceptor);
    }
    return clientBuilder.build();
}
}

Вот мой интерфейс:

@FormUrlEncoded
@POST("checkSubscribe")
Call<APIResponse<List<DataStatusSubscribe>>> getStatusSubscribe(@Field("msisdn") String msisdn);

Ваш onFailure выполняется? Если да, то в чем ошибка?

Sagar 11.04.2018 13:29

onFailure тоже не выполняется ..

Asqa 11.04.2018 13:31

Попытайтесь сохранить журнал OnFailure и проверьте, вызывает ли этот метод

Abubakker Moallim 11.04.2018 13:41

извините, исправьте мой комментарий выше об ошибке, выполненной, когда я поставил точку останова. но onResponse не выполняется ..

Asqa 11.04.2018 13:46

Кажется, проблема может быть внутри ServicesFactory.getService (это). Пожалуйста проверьте и подтвердите

Android Team 11.04.2018 13:46

Также вы можете получить ЖУРНАЛ, в котором будет указано, есть ли какие-либо проблемы.

Android Team 11.04.2018 13:48

Можете ли вы обновить свой вопрос информацией из onFailure()

Sagar 11.04.2018 13:56

вот что я получил в onFailure: java.lang.IllegalStateException: ожидался BEGIN_ARRAY, но был STRING в строке 1, столбец 42, путь $ .data

Asqa 12.04.2018 05:32
0
8
930
2

Ответы 2

Класс модели вашего ответа JSON:

dummy.java

public class dummy {


    /**
     * code : 200
     * error_message : null
     * data : [{"ID":"6917","msisdn":"2013304044","operator_id":"3","service":"AB3","status":"0","apps_status":"0","sub_start":"2018-04-10 16:48:28","sub_end":"2018-04-10 16:59:50","renewal":"0000-00-00"}]
     */

    private int code;
    private Object error_message;
    private List<DataBean> data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public Object getError_message() {
        return error_message;
    }

    public void setError_message(Object error_message) {
        this.error_message = error_message;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {
        /**
         * ID : 6917
         * msisdn : 2013304044
         * operator_id : 3
         * service : AB3
         * status : 0
         * apps_status : 0
         * sub_start : 2018-04-10 16:48:28
         * sub_end : 2018-04-10 16:59:50
         * renewal : 0000-00-00
         */

        private String ID;
        private String msisdn;
        private String operator_id;
        private String service;
        private String status;
        private String apps_status;
        private String sub_start;
        private String sub_end;
        private String renewal;

        public String getID() {
            return ID;
        }

        public void setID(String ID) {
            this.ID = ID;
        }

        public String getMsisdn() {
            return msisdn;
        }

        public void setMsisdn(String msisdn) {
            this.msisdn = msisdn;
        }

        public String getOperator_id() {
            return operator_id;
        }

        public void setOperator_id(String operator_id) {
            this.operator_id = operator_id;
        }

        public String getService() {
            return service;
        }

        public void setService(String service) {
            this.service = service;
        }

        public String getStatus() {
            return status;
        }

        public void setStatus(String status) {
            this.status = status;
        }

        public String getApps_status() {
            return apps_status;
        }

        public void setApps_status(String apps_status) {
            this.apps_status = apps_status;
        }

        public String getSub_start() {
            return sub_start;
        }

        public void setSub_start(String sub_start) {
            this.sub_start = sub_start;
        }

        public String getSub_end() {
            return sub_end;
        }

        public void setSub_end(String sub_end) {
            this.sub_end = sub_end;
        }

        public String getRenewal() {
            return renewal;
        }

        public void setRenewal(String renewal) {
            this.renewal = renewal;
        }
    }
}

звонок с Call<dummy> getData();

Call<dummy> call1 = apiInterface.getData();
        call1.enqueue(new Callback<dummy>() {
            @Override
            public void onResponse(Call<dummy> call, final Response<dummy> response) {
                if (response.body() != null) {
                }
            }

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

            }
        });

создайте класс pojo для ответа json, как показано ниже.

public class Datum {

@SerializedName("ID")
private String iD;
@SerializedName("msisdn")
private String msisdn;
@SerializedName("operator_id")
private String operatorId;
@SerializedName("service")
private String service;
@SerializedName("status")
private String status;
@SerializedName("apps_status")
private String appsStatus;
@SerializedName("sub_start")
private String subStart;
@SerializedName("sub_end")
private String subEnd;
@SerializedName("renewal")
private String renewal;

public String getID() {
    return iD;
}

public void setID(String iD) {
    this.iD = iD;
}

public String getMsisdn() {
    return msisdn;
}

public void setMsisdn(String msisdn) {
    this.msisdn = msisdn;
}

public String getOperatorId() {
    return operatorId;
}

public void setOperatorId(String operatorId) {
    this.operatorId = operatorId;
}

public String getService() {
    return service;
}

public void setService(String service) {
    this.service = service;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public String getAppsStatus() {
    return appsStatus;
}

public void setAppsStatus(String appsStatus) {
    this.appsStatus = appsStatus;
}

public String getSubStart() {
    return subStart;
}

public void setSubStart(String subStart) {
    this.subStart = subStart;
}

public String getSubEnd() {
    return subEnd;
}

public void setSubEnd(String subEnd) {
    this.subEnd = subEnd;
}

public String getRenewal() {
    return renewal;
}

public void setRenewal(String renewal) {
    this.renewal = renewal;
}

}

затем сделайте ответный класс pojo, как показано ниже.

public class ResponseData {

@SerializedName("code")
private Integer code;
@SerializedName("error_message")
private Object errorMessage;
@SerializedName("data")
private List<Datum> data = null;

public Integer getCode() {
    return code;
}

public void setCode(Integer code) {
    this.code = code;
}

public Object getErrorMessage() {
    return errorMessage;
}

public void setErrorMessage(Object errorMessage) {
    this.errorMessage = errorMessage;
}

public List<Datum> getData() {
    return data;
}

public void setData(List<Datum> data) {
    this.data = data;
}

}

затем после make api передать класс ответа, как показано ниже. @Получать() CallgetData ();

когда вы вызываете активность, как показано ниже.

    Call<List<ResponseData>> call = api.getData();

    call.enqueue(new Callback<List<ResponseData>>() {
    @Override
    public void onResponse(Call<List<ResponseData>> call, Response<List<ResponseData>> response) {
        if (response.isSuccessful() && response.body().isSuccessful()){
            ResponseData data=response.body();
            //Log.d("Message:",data.getErrorMessage);
        }
    }

    @Override
    public void onFailure(Call<List<Hero>> call, Throwable t) {
        Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
    }
});

я использую метод POST .. это повлияет на ваш код выше?

Asqa 11.04.2018 14:39

Нет, это не повлияет, если вы использовали только сообщение, главное, как получить ответ.

Android Team 11.04.2018 14:41

ServiceFactory - это экземпляр объекта модернизации.

Android Team 11.04.2018 14:50

Вызовите <APIResponse <List <DataStatusSubscribe> >> в этой строке поместите только класс ResponseData выше класса pojo. и при получении ответа привяжите данные соответственно.

Android Team 11.04.2018 14:55

Другие вопросы по теме