使用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对象
洞察力赞赏
答案 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) {
}
}
);