このスレッドはかなり古いことは知っていますが、この問題が発生し、多くの面で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() {
}
}
少しやり過ぎに思えるかもしれませんが、すべてのケースがあるので、これらすべてのコンストラクターがあるのはかなりクールです。
(もちろん、メインコンストラクターは可能ですが、直接使用することを意図したものではありません)。
- 応答がPOJOに解析されたリクエスト/ヘッダーが手動で設定された/ POJOが送信する
- POJO / POJOに解析された応答を送信する要求
- POJOに解析された応答を含む要求/送信する文字列
- POJO(GET)に解析された応答を含む要求
- POJO(GET)に解析された応答を含む要求/ヘッダーを手動で設定
- 応答のない要求(200-空の本文)/手動で設定されたヘッダー/送信するPOJO
- 応答のない要求(200-Empty Body)/送信するPOJO
- 応答のない要求(200-空の本文)/送信する文字列
もちろん、それが機能するためには、GoogleのGSONLibが必要です。追加するだけです:
compile 'com.google.code.gson:gson:x.y.z'
依存関係に(現在のバージョンは2.3.1
)。
HashMap
あなたの例では、これは一種の冗長です。'トークン'をJSONObject
中間マップなしで直接に置くことができます。