博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Volley源码分析(一)
阅读量:6810 次
发布时间:2019-06-26

本文共 2281 字,大约阅读时间需要 7 分钟。

  hot3.png

欢迎点击 「算法与编程之美」 关注我

本文首发于微信公众号:"算法与编程之美",欢迎关注。

1 前言

我们首先来看一下使用Volley执行一个简单的Http GET请求的案例。

RequestQueue queue = Volley.newRequestQueue(getApplicationContext());StringRequest stringRequest = new StringRequest(Request.Method.GET, “某URL”, new Response.Listener
() {    @Override    public void onResponse(String response) {        // 请求执行成功时执行的代码,由用户添加。        } catch (JSONException e) {            e.printStackTrace();        }    }}, new Response.ErrorListener() {    @Override    public void onErrorResponse(VolleyError error) {        error.printStackTrace();    }});queue.add(stringRequest);

上面的代码很简单,主要由三个步骤:

第一步,初始化一个queue;

第二步,初始化一个request,并编写请求执行成功和失败时的代码;

第三步,将request添加到queue。

短短的三步就可以利用volley完成http get请求,非常的简单易懂。

2 源码分析

接下来就分析这三步的背后Volley到底做了什么,帮助大家更好的理解Volley。

(一)   初始化RequestQueue

RequestQueue queue = Volley.newRequestQueue(getApplicationContext());

做的工作主要有:

1)   使用默认的HurlStack;

2)   使用默认的BasicNetwork;

3)   启动queue;

a)   默认启动4个线程NetworkDispatcher;

NetworkDispatcher线程运行主要的工作:

1)   从queue中取一个request;

// Take a request from the queue.request = mQueue.take();

2)   调用network来执行该request得到NetworkResponse;

// Perform the network request.NetworkResponse networkResponse = mNetwork.performRequest(request);

3)   将NetworkResponse转化成Response;

// Parse the response here on the worker thread.Response
response = request.parseNetworkResponse(networkResponse);

4)   利用ResponseDelivery最终调用request的onResponse方法。

mDelivery.postResponse(request, response);

利用Executor执行一个新的进程ResponseDeliveryRunnable,该进程最终调用request的监听器方法。

// Deliver a normal response or error, depending.if (mResponse.isSuccess()) {    mRequest.deliverResponse(mResponse.result);} else {    mRequest.deliverError(mResponse.error);}@Overrideprotected void deliverResponse(String response) {    if (mListener != null) {        mListener.onResponse(response);    }}

(二)   初始化request的代码由用户编写,主要提供Http请求方法、url地址、请求成功和失败时的执行代码。

(三)   将request添加到queue

queue.add(stringRequest);
将request添加到queue,Volley底层使用的queue是PriorityBlockingQueue。

3 总结

下面将总结Volley的执行流程:

  1. 在初始化RequestQueue的时候,启动了四个线程NetworkDispatcher,这四个线程不停的从queue中获取request;
  2. 调用Network来执行该request得到NetworkResponse;
  3. 由request将NetworkResponse转化为Response;
  4. 将request和response交给ResponseDelivery;
  5. 执行成功后调用request中用户编写的onResponse方法。

转载于:https://my.oschina.net/gschen/blog/1527822

你可能感兴趣的文章