Miguel-这种方法只有在成功响应时才被调用吗?
对于所有状态代码< 200或状态代码> 200 volley调用parseNetworkError(VolleyError volleyError)而不是parseNetworkResponse(NetworkResponse response)方法.看这里 –
行号-118-120
if (statusCode < 200 || statusCode > 299) {
throw new IOException();
}
和相应的catch块行号 – 128 -151
catch (IOException e) {
int statusCode = 0;
NetworkResponse networkResponse = null;
if (httpResponse != null) {
statusCode = httpResponse.getStatusLine().getStatusCode();
} else {
throw new NoConnectionError(e);
}
VolleyLog.e("Unexpected response code %d for %s", statusCode, request.getUrl());
if (responseContents != null) {
networkResponse = new NetworkResponse(statusCode, responseContents,
responseHeaders, false);
if (statusCode == HttpStatus.SC_UNAUTHORIZED ||
statusCode == HttpStatus.SC_FORBIDDEN) {
attemptRetryOnException("auth",
request, new AuthFailureError(networkResponse));
} else {
// TODO: Only throw ServerError for 5xx status codes.
throw new ServerError(networkResponse);
}
} else {
throw new NetworkError(networkResponse);
}
}
如果要覆盖此行为,可以在BasicNetwork.java-> performRequest方法中添加特定于状态代码的实现.
编辑:
所以它不是因为状态代码而是因为空响应.好吧,我认为你正在做正确的事情来实现你的自定义Request类.
Volley附带了一些易于使用的预定义流行类型请求,但您可以随时创建自己的.
而不是基于状态代码的实现,我宁愿在解反序之前检查以下字符串是否为空 –
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
if (!jsonString .isEmpty()) {
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
}
else {
return Response.success(new JSONObject(),
HttpHeaderParser.parseCacheHeaders(response));
}
**没有测试过这个,但是你明白了:)