[关闭]
@946898963 2018-05-18T12:08:09.000000Z 字数 2490 阅读 980

Volley-StringRequest源码解析

Android控件跟框架 Android源码分析


建议先阅读:Volley-Request的源码解析

StringRequest是Request的子类,请求数据以字符串的形式返回。StringRequest的实现比较简单,源码如下:

  1. public class StringRequest extends Request<String> {
  2. private final Listener<String> mListener;
  3. public StringRequest(int method, String url, Listener<String> listener,
  4. ErrorListener errorListener) {
  5. super(method, url, errorListener);
  6. mListener = listener;
  7. }
  8. public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) {
  9. this(Method.GET, url, listener, errorListener);
  10. }
  11. @Override
  12. protected void deliverResponse(String response) {
  13. mListener.onResponse(response);
  14. }
  15. @Override
  16. protected Response<String> parseNetworkResponse(NetworkResponse response) {
  17. String parsed;
  18. try {
  19. parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
  20. } catch (UnsupportedEncodingException e) {
  21. parsed = new String(response.data);
  22. }
  23. return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
  24. }
  25. }

StringRequest构造方法就是简单的对成员变量进行赋值操作。StringRequest继承自Request,只比Request多了一个Listener成员变量。

  1. private final Listener<String> mListener;

Listener是Response中定义的的一个接口

  1. public class Response<T> {
  2. ....
  3. public interface Listener<T> {
  4. public void onResponse(T response);
  5. }
  6. ....
  7. }

我们创建Listener的子类,重写其onResponse的方法,在onRespons方法中,对请求返回的字符串数据进行处理。

  1. StringRequest stringRequest = new StringRequest(1, "", new Response.Listener<String>(){
  2. @Override
  3. public void onResponse(String response) {
  4. Log.d(TAG, response);
  5. }
  6. }, 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. @Override
  2. protected Response<String> parseNetworkResponse(NetworkResponse response) {
  3. String parsed;
  4. try {
  5. parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
  6. } catch (UnsupportedEncodingException e) {
  7. parsed = new String(response.data);
  8. }
  9. return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
  10. }

在该方法中首先按照响应首部中的编码方式(也就是服务器端对数据的编码方式),将服务器返回的数据转换成字符串。

parseCharset的作用是从服务器返回的“content-type”响应首部中解析出数据的编码方式,如果解析不到的话,就使用默认的编码方式“ISO-8859-1”。

然后利用得到的字符串和解析NetworkResponse对象得到的Cache.Entry对象,包装成一个Response对象返回。

parseCacheHeaders(response)的作用就是对NetworkResponse进行解析,生成一个Cache.Entry对象。

关于parseCharset方法和parseCacheHeaders方法,建议阅读:Volley-HttpHeaderParser源码解析

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注