1

使用 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 不返回错误对象

洞察力赞赏

4

3 回答 3

3

答案是您扩展或覆盖的任何 Volley 函数都必须具有

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

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

否则,您的网络调用将永远不会在该onResponse部分返回。

编辑:并且您的扩展请求类还必须实现交付错误以及交付响应

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

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

在你的构造函数中ErrorListener初始化

于 2014-02-06T17:20:39.783 回答
1

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

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

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

于 2014-02-04T15:37:31.957 回答
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 和 on 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) {


                }
            }
    );
于 2014-02-05T12:51:30.377 回答