Android Volley之自定义request

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);
     }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值