这与其说是一个答案,不如说是对您的解决方案的详细说明!首先,我使用来自我的 API 的 204 响应,并且遇到了与您完全相同的问题。我在 BasicNetwork.java 中使用了您的代码来解决它 - 行if (statusCode != HttpStatus.SC_NO_CONTENT && httpResponse.getEntity() != null)
我还发现,如果我使用标准JsonObjectRequest
请求,Response.ErrorListener
则会因为正文为空而触发。
我创建了一个新的JsonObjectRequestWithNull
,它在空或空白正文的情况下提供成功响应。代码:
public class JsonObjectRequestWithNull extends JsonRequest<JSONObject> {
public JsonObjectRequestWithNull(int method, String url, JSONObject jsonRequest,
Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
errorListener);
}
public JsonObjectRequestWithNull(String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener,
Response.ErrorListener errorListener) {
this(jsonRequest == null ? Request.Method.GET : Request.Method.POST, url, jsonRequest,
listener, errorListener);
}
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
//Allow null
if (jsonString == null || jsonString.length() == 0) {
return Response.success(null, HttpHeaderParser.parseCacheHeaders(response));
}
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
}
相关位是:
//Allow null
if (jsonString == null || jsonString.length() == 0) {
return Response.success(null, HttpHeaderParser.parseCacheHeaders(response));
}
希望对某人有所帮助。