我知道这个线程已经很老了,但是我遇到了这个问题,因此我想出了一个很酷的解决方案,该解决方案对很多人都非常有用,因为它可以在很多方面纠正/扩展Volley库。
我发现了一些不支持的即用Volley功能:
- 这
JSONObjectRequest
并不完美:您必须期望JSON
结尾处有一个(请参阅参考资料Response.Listener<JSONObject>
)。
- 空响应(状态为200)呢?
- 如果我直接从POJO上我该
ResponseListener
怎么办?
我或多或少在一个大型泛型类中编译了许多解决方案,以便为我引用的所有问题提供解决方案。
public class GenericRequest<T> extends JsonRequest<T> {
private final Gson gson = new Gson();
private final Class<T> clazz;
private final Map<String, String> headers;
private boolean muteRequest = false;
private GenericRequest(int method, Class<T> classtype, String url, String requestBody,
Response.Listener<T> listener, Response.ErrorListener errorListener, Map<String, String> headers) {
super(method, url, requestBody, listener,
errorListener);
clazz = classtype;
this.headers = headers;
configureRequest();
}
public GenericRequest(int method, String url, Class<T> classtype, Object toBeSent,
Response.Listener<T> listener, Response.ErrorListener errorListener, Map<String, String> headers) {
this(method, classtype, url, new Gson().toJson(toBeSent), listener,
errorListener, headers);
}
public GenericRequest(int method, String url, Class<T> classtype, Object toBeSent,
Response.Listener<T> listener, Response.ErrorListener errorListener) {
this(method, classtype, url, new Gson().toJson(toBeSent), listener,
errorListener, new HashMap<String, String>());
}
public GenericRequest(int method, String url, Class<T> classtype, String requestBody,
Response.Listener<T> listener, Response.ErrorListener errorListener) {
this(method, classtype, url, requestBody, listener,
errorListener, new HashMap<String, String>());
}
public GenericRequest(String url, Class<T> classtype, Response.Listener<T> listener, Response.ErrorListener errorListener) {
this(Request.Method.GET, url, classtype, "", listener, errorListener);
}
public GenericRequest(String url, Class<T> classtype, Response.Listener<T> listener, Response.ErrorListener errorListener, Map<String, String> headers) {
this(Request.Method.GET, classtype, url, "", listener, errorListener, headers);
}
public GenericRequest(int method, String url, Class<T> classtype, Object toBeSent,
Response.Listener<T> listener, Response.ErrorListener errorListener, Map<String, String> headers, boolean mute) {
this(method, classtype, url, new Gson().toJson(toBeSent), listener,
errorListener, headers);
this.muteRequest = mute;
}
public GenericRequest(int method, String url, Class<T> classtype, Object toBeSent,
Response.Listener<T> listener, Response.ErrorListener errorListener, boolean mute) {
this(method, classtype, url, new Gson().toJson(toBeSent), listener,
errorListener, new HashMap<String, String>());
this.muteRequest = mute;
}
public GenericRequest(int method, String url, Class<T> classtype, String requestBody,
Response.Listener<T> listener, Response.ErrorListener errorListener, boolean mute) {
this(method, classtype, url, requestBody, listener,
errorListener, new HashMap<String, String>());
this.muteRequest = mute;
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
if (muteRequest) {
if (response.statusCode >= 200 && response.statusCode <= 299) {
return Response.success(null, HttpHeaderParser.parseCacheHeaders(response));
}
} else {
try {
String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
T parsedObject = gson.fromJson(json, clazz);
return Response.success(parsedObject, HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JsonSyntaxException e) {
return Response.error(new ParseError(e));
}
}
return null;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return headers != null ? headers : super.getHeaders();
}
private void configureRequest() {
}
}
看起来有些矫kill过正,但是拥有所有这些构造函数确实很酷,因为您遇到了所有情况:
(当然,主构造函数并不是可以直接使用的)。
- 带有解析为POJO的响应的请求/手动设置标头/发送的POJO
- 请求与响应解析为POJO / POJO发送
- 响应解析为POJO的请求/要发送的字符串
- 带有解析为POJO(GET)的响应的请求
- 带有解析为POJO(GET)的响应的请求/标头已手动设置
- 请求无响应(200-空正文)/手动设置标题/ POJO发送
- 请求无响应(200-空主体)/ POJO发送
- 请求无响应(200-空正文)/要发送的字符串
当然,要使其正常运行,您必须拥有Google的GSON Lib。只需添加:
compile 'com.google.code.gson:gson:x.y.z'
到您的依赖项(当前版本为2.3.1
)。
HashMap
在您的示例中,这是多余的。您可以将“令牌”直接放入JSONObject
没有中间图的。