Volley-StringRequest源码解析

建议先阅读: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源码解析

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器