Volley的用法,相信大家都很熟悉了。一共分为三步,我称它为Volley三部曲:
1、new一个Request。(创建请求对象)
2、new一个RequestQueue。(创建请求对列)
3、将Request添加到RequestQueue中去。(把请求对象添加到请求队列中)
Request类是所有请求的父类,Volley提供的它的子类常见的有StringRequest、JsonObjectRequest、JsonArrayRequest等。但是这些显然不能满足我们所有的需求,比如说我们想用Gson来解析Json数据,希望发送请求后直接能够得到Bean对象,那么我们就得来自己设计GsonRequest。
那么,我们就来一步步实现GsonRequest。
1、写一个GsonRequest类继承Request。
-
-
-
- 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的代码
-
-
-
- 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);
- 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类。
-
-
-
- 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);
- 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) {
-
- }
- });
- RequestQueue requestQueue = Volley.newRequestQueue(this);
- requestQueue.add(request);
是不是很简单?就是依葫芦画瓢,要弄清楚Volley源码中的运行机制的话,请期待下一篇——Volley源码解析。