建议先阅读:Volley-Request的源码解析。
StringRequest是Request的子类,请求数据以字符串的形式返回。StringRequest的实现比较简单,源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class StringRequest extends Request<String> { private final Listener<String> mListener; public StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener) { super(method, url, errorListener); mListener = listener; } public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) { this(Method.GET, url, listener, errorListener); }
@Override protected void deliverResponse(String response) { mListener.onResponse(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)); } }
|
StringRequest构造方法就是简单的对成员变量进行赋值操作。StringRequest继承自Request,只比Request多了一个Listener成员变量。
1
| private final Listener<String> mListener;
|
Listener是Response中定义的的一个接口
1 2 3 4 5 6 7
| public class Response<T> { .... public interface Listener<T> { public void onResponse(T response); } .... }
|
我们创建Listener的子类,重写其onResponse的方法,在onRespons方法中,对请求返回的字符串数据进行处理。
1 2 3 4 5 6
| StringRequest stringRequest = new StringRequest(1, "", new Response.Listener<String>(){ @Override public void onResponse(String response) { Log.d(TAG, response); } }, null);
|
mListener.onResponse(String
response)是在deliverResponse中被调用的,而deliverResponse方法则是在ExecutorDelivery中被调用的,这个调用是发生在主线程的,所以我们可以在onResponse方法中操作UI,详细过程建议阅读:Volley-ResponseDelivery及其实现类的源码解析。
最主要的是parseNetworkResponse方法,parseNetworkResponse方法会对NetworkResponse进行解析,返回我们需要的类型的Response,如果我们想要定义自己的Request的话,就需要重写这个方法,将NetworkResponse解析成我们想要的类型的Response。这个方法是在NetworkDispatcher的run方法中被调用的,关于NetworkDispatcher,建议阅读:Volley-NetworkDispatcher源码解析。
parseNetworkResponse源码如下:
1 2 3 4 5 6 7 8 9 10
| @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)); }
|
在该方法中首先按照响应首部中的编码方式(也就是服务器端对数据的编码方式),将服务器返回的数据转换成字符串。
parseCharset的作用是从服务器返回的“content-type”响应首部中解析出数据的编码方式,如果解析不到的话,就使用默认的编码方式“ISO-8859-1”。
然后利用得到的字符串和解析NetworkResponse对象得到的Cache.Entry对象,包装成一个Response对象返回。
parseCacheHeaders(response)的作用就是对NetworkResponse进行解析,生成一个Cache.Entry对象。
关于parseCharset方法和parseCacheHeaders方法,建议阅读:Volley-HttpHeaderParser源码解析。
上一篇:Volley-JsonRequest<T>及其两个子类的源码解析
下一篇:Volley-HttpHeaderParser源码解析