Volley的用法,我相信大家都非常熟悉了。一共分为三步:
1、new一个Request。
2、new一个RequestQueue。
3、将Request添加到RequestQueue中去。
Request类是所有请求的父类,Volley提供的它的子类常见的有StringRequest、JsonObjectRequest、JsonArrayRequest等。但是这些显然不能满足我们所有的需求,比如说我们想用Gson来解析Json数据,希望发送请求后直接能够得到Bean对象,那么我们就得来自己设计GsonRequest。
那么,我们就来一步步实现GsonRequest。
1、写一个GsonRequest类继承Request。
/**
* Created by leevi on 16/9/23.
*/
public class GsonRequest extends Request {
public GsonRequest(int method, String url, Response.ErrorListener listener) {
super(method, url, listener);
}
@Override
protected Response parseNetworkResponse(NetworkResponse response) {
return null;
}
@Override
protected void deliverResponse(Response response) {
}
}
从上述代码我们可以发现,必须重写parseNetworkResponse和deliverResponse两个方法。
先看第一个方法吧,parseNetworkResponse方法。既然是自定义Request,那么我们就参考StringRequest来看看parseNetworkResponse这个方法到底做了什么事情。
下面是StringRequest中parseNetworkResponse方法的代码
@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));
}
方法的具体实现其实很简单,就是将服务器响应的数据解析成String出来,并调用Response.success方法将数据包装后return出去。
那我们也依葫芦画瓢来重写咱们GsonRequest的代码
/**
* Created by leevi on 16/9/23.
*/
public class GsonRequest<T> extends Request<T> {
private final Gson gson = new Gson();
private final Class<T> clazz;
public GsonRequest(String url, Response.ErrorListener listener, Class<T> clazz) {
super(Method.GET, url, listener);//默认Get请求
this.clazz = clazz;
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try
{
/**
* 得到返回的数据
*/
String jsonStr = new String(response.data);
/**
* 转化成对象
*/
return Response.success(gson.fromJson(jsonStr, clazz), HttpHeaderParser.parseCacheHeaders(response));
} catch (JsonSyntaxException e)
{
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(T response) {
}
}
在parseNetworkResponse方法中使用Gson将response解析成Bean对象,并调用Response.success方法将数据包装后return出去。
接下来咱们看看StringRequest中的第二个方法——deliverResponse方法。
@Override
protected void deliverResponse(String response) {
mListener.onResponse(response);
}
具体实现更加简单,就是通过mListener将解析出来的response传递出去到给用户。至于deliverResponse方法是何时何地调用、怎么获取解析后的数据的,且看下篇——Volley源码分析,给各位看官慢慢道来。
咱们接着依葫芦画瓢来继续完成咱们的GsonRequest类。
/**
* Created by leevi on 16/9/23.
*/
public class GsonRequest<T> extends Request<T> {
private final Gson gson = new Gson();
private final Class<T> clazz;
private final Response.Listener<T> mListener;
public GsonRequest(String url, Response.ErrorListener listener, Class<T> clazz, Response.Listener<T> listener1) {
super(Method.GET, url, listener);//默认get请求
this.clazz = clazz;
mListener = listener1;
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try
{
/**
* 得到返回的数据
*/
String jsonStr = new String(response.data);
/**
* 转化成对象
*/
return Response.success(gson.fromJson(jsonStr, clazz), HttpHeaderParser.parseCacheHeaders(response));
} catch (JsonSyntaxException e)
{
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(T response) {
//将数据传递出去。
mListener.onResponse(response);
}
}
至此,自定义GsonRequest就完成了,当我们使用GsonRequest发送请求时,我们就能在成功的回调中直接获取解析出来的Bean对象了。
用法如下:
GsonRequest request = new GsonRequest(url, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}, Bean.class, new Response.Listener() {
@Override
public void onResponse(Bean response) {
//获取到Bean对象
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(request);
是不是很简单?就是依葫芦画瓢,要弄清楚Volley源码中的运行机制的话,请期待下一篇——Volley源码解析。