【问题标题】:onResponse won't execute when calling data with retrofit使用改造调用数据时不会执行 onResponse
【发布时间】:2018-04-11 11:23:01
【问题描述】:

我尝试使用 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"
        }
    ]
}

这是我的 APIResponse:

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

这是我的基本响应:

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 执行了吗?如果是这样,错误是什么?
  • onFailure 也没有执行..
  • 尝试保持登录 OnFailure 并检查该方法是否正在调用
  • 对不起,修改我上面的评论 onFailure 当我放断点时执行。但 onResponse 没有执行..
  • 似乎问题可能在 ServicesFactory.getService(this) 内部。请检查确认

标签: android retrofit jsonresponse


【解决方案1】:

您的 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&lt;dummy&gt; 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) {

            }
        });

【讨论】:

    【解决方案2】:

    为 json 响应创建 pojo 类,如下所示 ..

    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;
    }
    

    }

    然后在使 api 传递响应类之后,如下所示.. @得到() 调用getData();

    当您调用如下代码的活动时..

        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 方法.. 这会对您上面的代码生效吗?
    • 不,如果您仅使用帖子主要如何获得响应,则不会影响。
    • ServiceFactory 是改造对象的实例。
    • Call>> 这一行仅将 ResponseData 类放在 pojo 类之上。并在获得响应时根据数据绑定数据。
    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多