Miguel-仅在成功响应后才调用此方法吗?
对于所有状态代码<200或状态代码> 200,Volley调用parseNetworkError(VolleyError
volleyError)而不是parseNetworkResponse(NetworkResponse response)方法。看这里 -
https://android.googlesource.com/platform/frameworks/volley/+/master/src/com/android/volley/toolbox/BasicNetwork.java
行号-118-120
if (statusCode < 200 || statusCode > 299) { throw new IOException(); }和相应的捕获块行号-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 pre %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 pres. 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));}**尚未测试过,但您明白了:)



