ฉันรู้ว่าเธรดนี้ค่อนข้างเก่า แต่ฉันมีปัญหานี้และฉันได้หาวิธีแก้ปัญหาที่ยอดเยี่ยมซึ่งมีประโยชน์มากสำหรับหลาย ๆ คนเพราะมันแก้ไข / ขยายคลัง 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 / Headers ตั้งค่าด้วยตนเอง / POJO เพื่อส่ง
- คำขอพร้อมคำตอบแยกวิเคราะห์เป็น POJO / POJO เพื่อส่ง
- คำขอพร้อมคำตอบแยกวิเคราะห์เป็น POJO / String to Send
- คำขอพร้อมคำตอบแยกวิเคราะห์เป็น POJO (GET)
- คำขอพร้อมคำตอบแยกวิเคราะห์เป็น POJO (GET) / ส่วนหัวตั้งค่าด้วยตนเอง
- คำขอโดยไม่มีการตอบกลับ (200 - เนื้อหาว่างเปล่า) / ตั้งค่าส่วนหัวด้วยตนเอง / POJO เพื่อส่ง
- คำขอที่ไม่มีการตอบกลับ (200 - ร่างกายว่างเปล่า) / POJO ที่จะส่ง
- คำขอที่ไม่มีการตอบกลับ (200 - เนื้อความว่างเปล่า) / สตริงที่จะส่ง
แน่นอนเพื่อให้ใช้งานได้คุณต้องมี GSON Lib ของ Google เพียงเพิ่ม:
compile 'com.google.code.gson:gson:x.y.z'
ไปยังการอ้างอิงของคุณ (เวอร์ชันปัจจุบันคือ2.3.1
)
HashMap
เป็นชนิดของการซ้ำซ้อนในตัวอย่างของคุณ คุณสามารถใส่ 'โทเค็น' ลงJSONObject
ในแผนที่ตรงกลางได้โดยตรง