আমি জানি যে এই থ্রেডটি বেশ পুরানো, তবে আমার এই সমস্যাটি ছিল এবং আমি একটি দুর্দান্ত সমাধান নিয়ে এসেছি যা অনেকের পক্ষে খুব কার্যকর হতে পারে কারণ এটি ভলির লাইব্রেরিটিকে অনেক দিক থেকে সংশোধন / প্রসারিত করে।
আমি কিছু সমর্থিত-না-বক্স-ভলির বৈশিষ্ট্যগুলি চিহ্নিত করেছি:
- এটি
JSONObjectRequest
নিখুঁত নয়: আপনাকে JSON
শেষের দিকে আশা করতে হবে (দেখুন Response.Listener<JSONObject>
)।
- খালি রেসপন্সগুলি সম্পর্কে (কেবলমাত্র 200 টি স্ট্যাটাস সহ)?
- আমি সরাসরি আমার পোজো চাইলে আমি কী করব
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 প্রেরণের প্রতিক্রিয়া সহ অনুরোধ প্রেরণ করুন to
- প্রতিক্রিয়া অনুরোধ পাঠানোর জন্য POJO / POJO এ পার্স করা হয়েছে
- প্রতিক্রিয়া অনুরোধ POJO / স্ট্রিং পাঠানোর জন্য পার্স করা
- POJO (GET) এ পার্স করা প্রতিক্রিয়াটির অনুরোধ
- POJO (GET) / শিরোনামগুলিতে ম্যানুয়ালি সেট করা প্রতিক্রিয়ার অনুরোধ
- কোনও প্রতিক্রিয়া ছাড়াই অনুরোধ (200 - খালি শরীর) / শিরোনাম ম্যানুয়ালি প্রেরণ করতে / POJO সেট করে
- কোনও প্রতিক্রিয়া ছাড়াই অনুরোধ (200 - খালি দেহ) / পাঠানোর জন্য POJO
- কোনও সাড়া না দিয়ে অনুরোধ (200 - খালি দেহ) / স্ট্রিং প্রেরণ
অবশ্যই এটি যাতে কাজ করে, আপনার গুগলের জিএসএন লিব থাকতে হবে; শুধু যোগ কর:
compile 'com.google.code.gson:gson:x.y.z'
আপনার নির্ভরতা (বর্তমান সংস্করণ হয় 2.3.1
)।
HashMap
আপনার উদাহরণে অপ্রয়োজনীয় ধরনের।JSONObject
মধ্যবর্তী মানচিত্র ছাড়াই আপনি সরাসরি 'টোকেন' রাখতে পারেন ।