이 스레드가 꽤 오래되었다는 것을 알고 있지만,이 문제가 있었고 많은 측면에서 Volley 라이브러리를 수정 / 확장했기 때문에 많은 사람들에게 매우 유용 할 수있는 멋진 솔루션을 찾았습니다.
지원되지 않는 일부 Volley 기능을 발견했습니다.
- 이것은
JSONObjectRequest
완벽하지 않습니다. JSON
마지막에 a를 예상해야합니다 (참조 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-빈 본문) / 보낼 POJO
- 응답이없는 요청 (200-빈 본문) / 보낼 문자열
물론 작동하려면 Google의 GSON Lib이 있어야합니다. 다음을 추가하십시오.
compile 'com.google.code.gson:gson:x.y.z'
종속성 (현재 버전은입니다 2.3.1
).
HashMap
귀하의 예제에서 중복의 종류이다.JSONObject
중간 맵없이 '토큰'을에 직접 넣을 수 있습니다 .