Я знаю, що цей потік досить старий, але у мене була така проблема, і я придумав круте рішення, яке може бути дуже корисним для багатьох, оскільки воно виправляє / розширює бібліотеку 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() {
}
}
Це може здатися трохи надмірним, але дуже здорово мати усі ці конструктори, тому що у вас є всі випадки:
(Основний конструктор не призначений для безпосереднього використання, хоча це, звичайно, можливо).
- Запит із відповіддю, проаналізованим POJO / Заголовки вручну встановлено / POJO - Надіслати
- Запит із відповіддю, проаналізований POJO / POJO для надсилання
- Запит із відповіддю проаналізовано POJO / String to Send
- Запит із відповіддю проаналізовано 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
без проміжної карти.