Miguel- Isn't this method called only if its a success response?
For all status codes <200 or status code >200 volley invokes parseNetworkError(VolleyError volleyError) instead of parseNetworkResponse(NetworkResponse response)method. Look here -
https://android.googlesource.com/platform/frameworks/volley/+/master/src/com/android/volley/toolbox/BasicNetwork.java
Line number -118-120
if (statusCode < 200 || statusCode > 299) {
throw new IOException();
}
and the corresponding catch block Line number - 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);
}
}
If you want to override this behavior you can add your status code specific implementation inside BasicNetwork.java->performRequest method.
Edit :
So its not because of status code but because of the empty response. Well I think you are doing the right thing implementing your custom Request class.
Volley comes with a few predefined popular types of requests for ease of use, but you can always create your own.
Instead of a status code based implementation i'd rather simply check if the following string is empty before deserialzing it -
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));
}
**haven't tested this, but you get the point :)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…