커스텀 요청 설정하기
이번 강좌는 어떻게 자신만의 커스텀 요청 타입을 사용하는지를 다룹니다. 해당 타입들은 Volley가 지원하는 기본 타입을 가지고 있지 않은 경우입니다.(out-of-the-box)
커스텀 요청 작성하기
대부분의 요청은 사용될 준비가 된 상태로 (ready-to-use) toolbox에 존재합니다. 만약 응답의 형태가 문자열, 이미지 또는 JSON일 경우 커스텀 요청을 사용할 필요가 없습니다.
커스텀 요청을 사용해야 하는 경우는 다음과 같습니다.
request<T>클래스를 상속해야하는 경우, <T>는 예상되는 요청에 대한 변환된 응답의 타입을 의미합니다. 만약 변환된 응답이 문자열일 경우 커스텀 요청은 Request<String>을 상속하게 됩니다. Request<T>를 상속한 예제인 StringRequest 와 IamgeRequest 같은 Volley toolbox클래스들을 살펴보십시오.
추상 메소드인 parseNetworkResponse() 사용, 그리고 deliverResponse() 사용.자세한 것은 아래에 쓰여있습니다.
parseNetworkResponse
어떠한 주어진 타입(예를 들면 문자열, 이미지, 그리고 JSON)을 전달을 위해서 변환된 응답으로 캡슐화 합니다. 아래는 parseNetworkResponse()의 예제입니다.
@Override
protected Response<T> parseNetworkResponse(
NetworkResponse response) {
try {
String json = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(gson.fromJson(json, clazz),
HttpHeaderParser.parseCacheHeaders(response));
}
// 오류를 처리합니다.
...
}
참고:
- parseNetworkResponse()는 NetworkResponse를 매개 변수(Parameter)로 취합니다. NetworkResponse는 바이트열(byte[]),HTTP 상태 코드, 그리고 반응 헤더를 탑재한 응답을 포함합니다.
- 반드시 Response<T>가 반환되어야 합니다. Response<T>는 분류된 반응 객체, 캐시 메타데이터, 또는 변환 실패 오류같은 어떠한 오류를 포함해야합니다.
반약 당신의 프로토콜이 비표준 캐시 방식을 따른다면(non-standard cache semantics), 스스로 Cache.entry를 만들 수 있습니다. 그러나 대부분의 요청들은 아래처럼 처리할 수 있습니다.
return Response.success(myDecodedObject,
HttpHeaderParser.parseCacheHeaders(response));
Volley는 워커 쓰레드에서 parseNetworkResponse()를 호출합니다. 이는 고비용의 변환 작업, 예를 들면 JPEG를 비트맵으로 변환하는 작업들이 사용자 인터페이스를 막는 것을 방지합니다.
deliverResponse
Volley는 parseNetworkResponse()로 반환된 객체를 메인 쓰레드로 전달할 수 있습니다. 대부분의 요청은 여기서 콜백 함수를 실행합니다. 예를 들면 아래와 같습니다
protected void deliverResponse(T response) {
listener.onResponse(response);
예제: GsonRequest
Gson은 자바 객체를 JSON형태로 변환 또는 그 반대에 해당하는 변환을 하는 라이브러리입니다. 상응하는 JSON 키값을 이름으로 갖는 자바 객체를 정의하며, Gson에 객체를 전달함으로써, Gson이 각각의 필드값을 채웁니다. 아래는 응답 변환을 위해 Gson을 사용한 Volley 사용의 완성된 예제입니다.
public class GsonRequest<T> extends Request<T> {
private final Gson gson = new Gson();
private final Class<T> clazz;
private final Map<String, String> headers;
private final Listener<T> listener;
/**
* GET요청을 만들고 JSON으로부터 변환된 객체를 반환합니다.
*
* @매개 변수 url: 요청이 전달될 URL입니다.
* @매개 변수 clazz: Gson의 리플렉션 (변환)을 위한 연관 클래스 객체입니다.
* @매개변수 headers: 요청 헤더에 해당하는 Map입니다.
*/
public GsonRequest(String url, Class<T> clazz, Map<String, String> headers,
Listener<T> listener, ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.clazz = clazz;
this.headers = headers;
this.listener = listener;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return headers != null ? headers : super.getHeaders();
}
@Override
protected void deliverResponse(T response) {
listener.onResponse(response);
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String json = new String(
response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(
gson.fromJson(json, clazz),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JsonSyntaxException e) {
return Response.error(new ParseError(e));
}
}
}
Volley는 사용을 위해 미리 만들어진 JsonArrayRequest와 JsonArrayObjects클래스들을 제공합니다. 만약 해당 클래스들을 사용하는 접근법을 선호하신다면, '표준 요청 만들기'를 확인하십시오.