@946898963
2018-05-18T04:08:09.000000Z
字数 2490
阅读 1232
Android控件跟框架 Android源码分析
建议先阅读:Volley-Request的源码解析。
StringRequest是Request的子类,请求数据以字符串的形式返回。StringRequest的实现比较简单,源码如下:
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);}@Overrideprotected void deliverResponse(String response) {mListener.onResponse(response);}@Overrideprotected 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成员变量。
private final Listener<String> mListener;
Listener是Response中定义的的一个接口
public class Response<T> {....public interface Listener<T> {public void onResponse(T response);}....}
我们创建Listener的子类,重写其onResponse的方法,在onRespons方法中,对请求返回的字符串数据进行处理。
StringRequest stringRequest = new StringRequest(1, "", new Response.Listener<String>(){@Overridepublic 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源码如下:
@Overrideprotected 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源码解析。