在之前的文章里我简单介绍了有关于StringRequest和JsonRequest两种请求,并且总结出了它们的用法都是非常类似的,基本就是进行以下三步操作即可:
创建一个RequestQueue对象。
创建一个Request对象。
将Request对象添加到RequestQueue里面。
其中,StringRequest和JsonRequest都是继承自Request的,所以它们的用法才会如此类似.
那么既然Volley是开源的框架,我们是不是可以自己写一个属于自己的Request呢?
答案是肯定的,我们十分的想将Volley请求下来的数据进行解析直接使用,所以呢,我们就来直接制定一个属于自己的Request,接下来我就带着大家一起畅游随心所欲的代码世界.
这里写代码片
定义一个GsonRequest继承自Request,代码如下所示:
/**
* @硕哥告诉你
* 16/5/11上午10:01
* 首先你要为你的Request添加泛型然后继承Request<T>
*
*/
public class GsonResquest<T> extends Request<T> {
private Response.Listener<T> mListener; //用于回调的接口对象
private Gson mGson; //一会儿用来解析的Gson
private Class<T> mClass;//这就是我的带泛型的实体类
//构造方法
public GsonResquest(int method, String url, Response.ErrorListener listener, Response.Listener<T> mListener, Class<T> mClass) {
super(method, url, listener);
this.mListener = mListener;
this.mGson = new Gson();
this.mClass = mClass;
}
//因为上面的构造方法中第一个参数就是我的请求类型,都是Get类型,所以我在写一个构造方法简化一下代码
public GsonResquest(String url, Response.ErrorListener listener,Response.Listener mListener,Class mClass){
this(Method.GET,url,listener,mListener,mClass);
}
//复写的方法 这个方法里我们添加的是网络请求,并且将我们想得到的数据进行解析.
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
//首先要获取我们想要解析的数据
String data = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
//这里我们返回的就是成功时候的回调.直接将数据解析,注意一下第二个参数是缓存入口,这里我们直接设置的就是HttpHeaderParser.parseCacheHeaders(response)
return Response.success(mGson.fromJson(data,mClass),HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
//若出现异常,返回失败时候的回调
return Response.error(new ParseError(e));
}
}
//这个方法是对请求的response进行的反馈.
@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
}
这里我们已经GsonRequest写好了,接下来我们就使用一下这个自定义的请求方式吧
实现很简单
不要先创建请求队列呦 这里我就补贴代码了
GsonResquest<Bean> gsonResquest = new GsonResquest<>("http://api.liwushuo.com/v2/channels/103/items?limit=20&ad=2&gender=2&offset=0&generation=1" ,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}, new Response.Listener<Bean>() {
@Override
public void onResponse(Bean response) {
Log.d("MainActivity" , "response.getData():" + response.getData());
}
},Bean.class);
requestQueue.add(gsonResquest);
好的这样我们就可以直接使用请求下来的数据了 哈哈哈.