@946898963
2018-05-18T12:08:09.000000Z
字数 2490
阅读 980
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);
}
@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成员变量。
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>(){
@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源码如下:
@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源码解析。