Android 截击永远不会返回截击错误或解释为什么会出现异常

Android 截击永远不会返回截击错误或解释为什么会出现异常,android,android-volley,jsonexception,Android,Android Volley,Jsonexception,使用Volley库,我扩展了Request对象以实现GSON序列化。然后,我扩展了这个新对象,以了解如何执行一些PUT请求。这是GSON序列化的第一个对象: @Override protected Response<t> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderPars

使用Volley库,我扩展了Request对象以实现GSON序列化。然后,我扩展了这个新对象,以了解如何执行一些
PUT
请求。这是GSON序列化的第一个对象:

@Override  
protected Response<t> parseNetworkResponse(NetworkResponse response) {  
    try {  
        String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); //response may be too large for string?
        t parsedGSON = mGson.fromJson(jsonString, cls);
        Response <t> returnMessage = Response.success(parsedGSON,  
                HttpHeaderParser.parseIgnoreCacheHeaders(response));
        return returnMessage;

    } catch (UnsupportedEncodingException e) { 
        e.printStackTrace();
        return Response.error(new ParseError(e));  
    } catch (JsonSyntaxException je) {
        je.printStackTrace();
        Log.e("GsonRequest", je.getMessage()!=null?je.getMessage():"JsonSyntaxError");
        return Response.error(new ParseError(je));  
    }  
}  
从不调用
onErrorResponse
(我的
onResponse
部分也不调用)

所以现在我不知道为什么当序列化成功时,Volley会捕获JSONException,我也不知道为什么Volley不会返回错误对象


我今天早上也有同样的问题。可能您没有收到Json作为响应,您的服务器以200 OK作为响应,但Volley正在等待接收Json。然后,当它没有收到Json时,它会生成一个错误,这个错误没有HTTP代码(因为它不是),而是一个凌乱的内部错误

您可以通过使用正确的对象(来自volley库)来执行请求来解决此问题

如果使用JsonObjectRequest,则volley需要在请求主体中使用JSONObject,并在响应对象中使用JSONObject。 如果使用JsonArrayRequest,则在请求中需要一个JSONArray,在响应中需要一个JSONArray。
对于每种不同的情况,您都需要扩展JsonRequest类来管理响应。

今天早上我遇到了同样的问题。可能您没有收到Json作为响应,您的服务器以200 OK作为响应,但Volley正在等待接收Json。然后,当它没有收到Json时,它会生成一个错误,这个错误没有HTTP代码(因为它不是),而是一个凌乱的内部错误

您可以通过使用正确的对象(来自volley库)来执行请求来解决此问题

如果使用JsonObjectRequest,则volley需要在请求主体中使用JSONObject,并在响应对象中使用JSONObject。 如果使用JsonArrayRequest,则在请求中需要一个JSONArray,在响应中需要一个JSONArray。
对于每种不同的情况,您都需要扩展JsonRequest类来管理响应。

对于JSON,为什么不使用自己的类作为答案,例如:

import com.google.gson.annotations.SerializedName;

public class UserData {
@SerializedName("email")
public String userMail;
@SerializedName("number")
public String number;
@SerializedName("loginName")
public String loginName;
@SerializedName("password")
public String password;
}

然后

public Request<?> getInformation(String loginName, String password, Response.Listener<UserData> responseListener,
                                         Response.ErrorListener errorListener) {

    String url = apiURL;

    Map<String, String> authHeaders = getAuthHeaders(loginName, password);
    authHeaders.put(HEADER_PARAM_INTERFACE_KEY, DPAG_INTERFACE_KEY);
    int method = Request.Method.GET;

    GsonRequest<UserData> request = new GsonRequest<UserData>(
            method,
            url,
            UserData.class,
            authHeaders,
            responseListener,
            errorListener,
            gson);


    return mQueue.add(request);
}
public请求获取信息(字符串登录名、字符串密码、Response.Listener responseListener、,
Response.ErrorListener(错误监听器){
字符串url=apiURL;
Map-authHeaders=getAuthHeaders(登录名、密码);
authHeaders.put(头参数接口键、DPAG接口键);
int method=Request.method.GET;
GsonRequest request=新的GsonRequest(
方法
网址,
UserData.class,
authHeaders,
负责人,
errorListener,
gson);
返回mQueue.add(请求);
}
这里加上onResponse和onerrorresponse

    Application.get().getApi().getInformation(loginName, password,
            new Response.Listener<UserData>() {

                @Override
                public void onResponse(UserData data) {

                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {


                }
            }
    );
Application.get().getApi().getInformation(登录名、密码、,
新的Response.Listener(){
@凌驾
公共void onResponse(用户数据){
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
}
}
);

对于JSON,为什么不使用自己的类作为答案,例如:

import com.google.gson.annotations.SerializedName;

public class UserData {
@SerializedName("email")
public String userMail;
@SerializedName("number")
public String number;
@SerializedName("loginName")
public String loginName;
@SerializedName("password")
public String password;
}

然后

public Request<?> getInformation(String loginName, String password, Response.Listener<UserData> responseListener,
                                         Response.ErrorListener errorListener) {

    String url = apiURL;

    Map<String, String> authHeaders = getAuthHeaders(loginName, password);
    authHeaders.put(HEADER_PARAM_INTERFACE_KEY, DPAG_INTERFACE_KEY);
    int method = Request.Method.GET;

    GsonRequest<UserData> request = new GsonRequest<UserData>(
            method,
            url,
            UserData.class,
            authHeaders,
            responseListener,
            errorListener,
            gson);


    return mQueue.add(request);
}
public请求获取信息(字符串登录名、字符串密码、Response.Listener responseListener、,
Response.ErrorListener(错误监听器){
字符串url=apiURL;
Map-authHeaders=getAuthHeaders(登录名、密码);
authHeaders.put(头参数接口键、DPAG接口键);
int method=Request.method.GET;
GsonRequest request=新的GsonRequest(
方法
网址,
UserData.class,
authHeaders,
负责人,
errorListener,
gson);
返回mQueue.add(请求);
}
这里加上onResponse和onerrorresponse

    Application.get().getApi().getInformation(loginName, password,
            new Response.Listener<UserData>() {

                @Override
                public void onResponse(UserData data) {

                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {


                }
            }
    );
Application.get().getApi().getInformation(登录名、密码、,
新的Response.Listener(){
@凌驾
公共void onResponse(用户数据){
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
}
}
);

答案是您扩展或覆盖的任何截击功能都必须具有

    @Override
protected void deliverResponse(T response) {
    // TODO Auto-generated method stub
    mListener.onResponse(response);
}
功能实现。侦听器必须在构造函数中初始化,并实现onResponse方法

否则,您的网络呼叫将永远不会在
onResponse
部分返回

编辑: 您的扩展请求类还必须实现deliverError以及deliverResponse

private final Listener<T> mListener;
private ErrorListener mErrorListener;

@Override
 public void deliverError(VolleyError error) {
    mErrorListener.onErrorResponse(error);
}
私人最终监听器;
私有ErrorListener-mErrorListener;
@凌驾
公共无效交付错误(截击错误){
mErrorListener.onErrorResponse(错误);
}

通过在构造函数中初始化
ErrorListener
,答案是您扩展或覆盖的任何截击函数都必须具有

    @Override
protected void deliverResponse(T response) {
    // TODO Auto-generated method stub
    mListener.onResponse(response);
}
功能实现。侦听器必须在构造函数中初始化,并实现onResponse方法

否则,您的网络呼叫将永远不会在
onResponse
部分返回

编辑: 您的扩展请求类还必须实现deliverError以及deliverResponse

private final Listener<T> mListener;
private ErrorListener mErrorListener;

@Override
 public void deliverError(VolleyError error) {
    mErrorListener.onErrorResponse(error);
}
私人最终监听器;
私有ErrorListener-mErrorListener;
@凌驾
公共无效交付错误(截击错误){
mErrorListener.onErrorResponse(错误);
}

通过在构造函数中初始化
ErrorListener
,您使用什么类型的对象来执行请求?您使用什么类型的对象来执行请求?嗯,我将请求扩展为