Android Volley之自定义request
Volley框架默认给我们提供了五种request:StringRequest、JsonRequest、JsonObjectRequest、JsonArrayRequest、ImageRequest。
先看下StringRequest是如何实现的:
1.首先继承于Request T代表此次请求所解析响应的类型,既然是StringRequest,这里应是String
2.定义回调监听对象,接收此次请求解析的响应结果:private final Listener mListener;
看下具体的定义:
/* Callback interface for delivering parsed responses. /
public interface Listener {
/* Called when a response is received. /
public void onResponse(T response);
}
3.定义构造函数,必须要调用父类的构造函数,将参数传递到Request抽象类中
//带有请求类型参数的构造函数
public StringRequest(int method, String url, Listener listener,
ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
}
//默认为GET请求
public StringRequest(String url, Listener listener, ErrorListener errorListener) {
this(Method.GET, url, listener, errorListener);
}
4.实现parseNetworkResponse抽象方法:
一般子类都必须实现此方法,来解析网络请求的响应,并且返回一个响应结果的Response类型,此方法将在工作线程被调用,如果返回的是null,将不会delivered response.
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
5.实现deliverResponse抽象方法:
发布响应结果,调用mListener onResponse方法,这个response对象来自于parseNetworkResponse 方法的返回
@Override
protected void deliverResponse(String response) {
mListener.onResponse(response);
}
下面自定义个Request,自带固定参数,避免每次封装参数都需要添加
public class CustomJsonObjectRequest extends Request<JSONObject> {
private static final String PROTOCOL_CHARSET = "utf-8";
private static final String PROTOCOL_CONTENT_TYPE = String.format(
"application/x-www-form-urlencoded; charset=%s", PROTOCOL_CHARSET);
private HashMap<String, String> mParams;
private final Listener<JSONObject> mListener;
public CustomJsonObjectRequest(String requestUrl, int method,
HashMap<String, String> params,
Listener<JSONObject> listener, ErrorListener errorListener) {
super(method, requset_url, errorListener);
mListener = listener;
mParams = params;
// 加上固定参数,这边假设每次请求需要传递access token
String token = "ssd885949--c9733-dyfm993828";
mParams.put(Consts.ACCESS_TOKEN, token);
}
@Override
protected void deliverResponse(JSONObject response) {
mListener.onResponse(response);
}
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser. parseCharset(response.headers));
return Response.success( new JSONObject(jsonString),
HttpHeaderParser. parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error( new ParseError(e));
} catch (JSONException je) {
return Response.error( new ParseError(je));
}
}
@Override
public String getBodyContentType() {
return PROTOCOL_CONTENT_TYPE;
}
@Override
public byte[] getBody() {
return encodeParameters(mParams , PROTOCOL_CHARSET);
}
}