Volley永远不会返回VolleyError或解释为什么会有例外

时间:2014-02-04 15:24:57

标签: android android-volley jsonexception

使用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));  
    }  
}  

当我的网络响应到达Response <t> returnMessage = Response.success(parsedGSON, HttpHeaderParser.parseIgnoreCacheHeaders(response));时,我已经使用我传入的正确类填充了<t>个对象,这些类完全序列化了所有变量并且没有错误。但由于某些原因,Volley跳转到} catch (JsonSyntaxException je) {,我无法通过调试断点或打印日志显示je的内容。同样在我的扩展课程中:

 new ErrorListener() {
        @SuppressWarnings("unused")
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();

永远不会调用onErrorResponse(也不是我的onResponse部分)

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

洞察力赞赏

3 个答案:

答案 0 :(得分:2)

答案是你扩展或覆盖的任何Volley功能都必须

    @Override
protected void deliverResponse(T response) {
    // TODO Auto-generated method stub
    mListener.onResponse(response);
}

功能实现。必须在构造函数中初始化Listener并实现onResponse方法。

否则您的网络通话将永远不会返回onResponse部分。

编辑: 并且您的扩展Request类还必须实现deliverError以及deliverResponse

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

@Override
 public void deliverError(VolleyError error) {
    mErrorListener.onErrorResponse(error);
}

在您的构造函数中初始化了ErrorListener

答案 1 :(得分:1)

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

您可以使用正确的对象(来自凌空库)来执行请求来解决问题。

如果使用JsonObjectRequest,则需要在请求的主体中使用JSONObject,并且该响应对象中的JSONObject是方面的。 如果使用JsonArrayRequest,则需要在请求中使用JSONArray,在响应中使用JSONArray。 对于每种不同的情况,您需要扩展JsonRequest类以管理响应。

答案 2 :(得分:1)

对于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);
}

此处还有onResponse和ErrorResponse

    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) {


                }
            }
    );