मुझे पता है कि यह धागा काफी पुराना है, लेकिन मुझे यह समस्या थी और मैं एक शांत समाधान के साथ आया था जो कई लोगों के लिए उपयोगी हो सकता है क्योंकि यह कई पहलुओं पर वॉली लाइब्रेरी को सही / विस्तारित करता है।
मुझे कुछ समर्थित नहीं आउट-ऑफ-द-बॉक्स वॉली विशेषताएं हैं:
- यह
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 को प्राप्त प्रतिक्रिया के साथ अनुरोध (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
बिना इंटरमीडिएट के नक्शे में सीधे 'टोकन' डाल सकते हैं ।