Android 安卓截击最后一次请求网络掉线后通话?

Android 安卓截击最后一次请求网络掉线后通话?,android,android-volley,Android,Android Volley,有网络的时候截击效果很好,但网络断开的时候截击会变得很奇怪 当网络强度下降,我发出post请求时,什么也不会发生,但一旦网络恢复到最大强度,它会调用前一个post请求,而不是新的post请求 当我清除缓存时,它工作得很好 如何解决这个问题,为什么我得到以前的帖子回复 // Implements required listeners public class VolleyServices<T> implements Response.Listener<T>, ErrorLi

有网络的时候截击效果很好,但网络断开的时候截击会变得很奇怪

当网络强度下降,我发出post请求时,什么也不会发生,但一旦网络恢复到最大强度,它会调用前一个post请求,而不是新的post请求

当我清除缓存时,它工作得很好

如何解决这个问题,为什么我得到以前的帖子回复

// Implements required listeners
public class VolleyServices<T> implements Response.Listener<T>, ErrorListener{

private int id; // request id
private RequestQueue request; // volley request queue
private VolleyResponce<T> listener; // callback listener
private Class<T> clazz;  // parsing class

public interface VolleyResponce<T> {
    public void OnSuccess(T response,int id);
    public void OnError(ServerError error,int id);
}

// Constructor
public VolleyServices(VolleyResponce<T> listener,Context context) {
    this.listener = listener;
    request = VolleyRequest.getInstance(context).getRequestQueue();
}

// call to post the request with parse class, post parameters in map and request id
public void post(String methodName, HashMap<String, String> map,Class<T> clazz,int id) {
    String url = baseUrl + methodName;
    this.clazz = clazz;
    this.id = id;
    GsonRequest<T> myReq = new GsonRequest<T>(Request.Method.POST,url,clazz,map,this,this);
    myReq.setTag(id);
    request.add(myReq);
}

@Override
public void onResponse(T response) {
    if(response != null && clazz == response.getClass()){               
        listener.OnSuccess(response,this.id);                               
    }       
}

@Override
public void onErrorResponse(VolleyError volleyError) {

    ServerError error = null;

    if(volleyError instanceof NetworkError) {
        error = new ServerError("No internet Access, Check your internet connection.","400");
    }

    if(volleyError instanceof AuthFailureError) {
        error = new ServerError("Authentication Failure","400");
    }

    if(volleyError instanceof ParseError) {
        error = new ServerError("Parsing error","400");
    }

    if(volleyError instanceof NoConnectionError) {
        error = new ServerError("No internet Access, Check your internet connection.","400");
    }

    if(volleyError instanceof TimeoutError) {
        error = new ServerError("Request timed out, Please try again later.","400");
    }

    if(volleyError.networkResponse != null && volleyError.networkResponse.statusCode == 500) {
        error = new ServerError("Internal server error","400");
    }

    else {
        try {
            if(volleyError.networkResponse != null) {
                String responseBody = new String(volleyError.networkResponse.data, "utf-8" );
                try{
                    Gson gson = new Gson();         
                    error = gson.fromJson(responseBody, ServerError.class);
                    if(error.status == null) {
                        error.status = "";
                    }
                }catch(Exception e){
                    e.printStackTrace();
                }
            } else {
                error = new ServerError("Unknown Error","400");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    listener.OnError(error,this.id);
}
//实现所需的侦听器
公共类VolleyServices实现Response.Listener、ErrorListener{
私有int-id;//请求id
private RequestQueue request;//截取请求队列
私有截击响应侦听器;//回调侦听器
私有类clazz;//解析类
公共接口截击应答{
成功时公共无效(T响应,int id);
public void OnError(ServerError,int-id);
}
//建造师
公共截击服务(截击应答器、上下文){
this.listener=listener;
request=VolleyRequest.getInstance(context.getRequestQueue();
}
//调用以使用parse类、post映射中的参数和请求id发布请求
公共void post(字符串方法名、HashMap映射、类clazz、int-id){
字符串url=baseUrl+methodName;
this.clazz=clazz;
this.id=id;
GsonRequest myReq=新的GsonRequest(Request.Method.POST、url、clazz、map、this、this);
myReq.setTag(id);
请求添加(myReq);
}
@凌驾
公共响应(T响应){
如果(response!=null&&clazz==response.getClass()){
OnSuccess(响应,this.id);
}       
}
@凌驾
公共错误响应(截击错误截击错误){
ServerError=null;
if(网络错误的截击错误实例){
error=newservererror(“无法访问internet,请检查您的internet连接。”,“400”);
}
if(截击错误实例AuthFailureError){
错误=新服务器错误(“身份验证失败”,“400”);
}
if(截击错误实例解析错误){
error=newservererror(“解析错误”,“400”);
}
if(截击错误实例无连接错误){
error=newservererror(“无法访问internet,请检查您的internet连接。”,“400”);
}
if(截击错误TimeoutError的实例){
error=newservererror(“请求超时,请稍后再试。”,“400”);
}
if(volleyError.networkResponse!=null&&volleyError.networkResponse.statusCode==500){
错误=新服务器错误(“内部服务器错误”,“400”);
}
否则{
试一试{
if(volleyError.networkResponse!=null){
String ResponseBy=新字符串(volleyError.networkResponse.data,“utf-8”);
试一试{
Gson Gson=新的Gson();
error=gson.fromJson(responseBody,ServerError.class);
if(error.status==null){
error.status=“”;
}
}捕获(例外e){
e、 printStackTrace();
}
}否则{
错误=新服务器错误(“未知错误”,“400”);
}
}捕获(不支持的编码异常e){
e、 printStackTrace();
}
}
listener.OnError(错误,this.id);
}

我捕获的一些日志消息详细解释了一切

你能添加你的代码吗?也许你忘记了截击请求的ErrorListener?不,我有ErrorListener…我已经过了一些代码我可以想象你在网络关闭时发布了一些请求,下次网络正常运行时,你会收到你以前的一个响应。你能说出在网络关闭时发布了多少个具有相同url的请求吗你真的想用
if(){}if(){}if(){}…
代替
if(){}else if(){}吗…
是的,我确实有点纠结于'if..if..if',如果'我这样做是因为我的服务器给我错误消息如果我这样做'if..else',那么我无法覆盖服务器错误消息。我只发布了一个具有相同url的请求,我锁定按钮直到成功,但它没有,所以我关闭应用程序并重新发布,它给了他以前的响应解释一切的日志链接