1 前言

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

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

StringRequest stringRequest = new StringRequest(Request.Method.GET, “某URL”, new Response.Listener<String>() {
    @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());

 

做的工作主要有:

  • 使用默认的HurlStack;

  • 使用默认的BasicNetwork;

  • 启动queue;

  • 默认启动4个线程NetworkDispatcher;

 

NetworkDispatcher线程运行主要的工作:

  • 从queue中取一个request;

 

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

 

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

 

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

 

  • 将NetworkResponse转化成Response;

 

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

 

  • 利用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);
}

@Override
protected void deliverResponse(Stringresponse) {
    if (mListener!= null) {
        mListener.onResponse(response);
    }
}

 

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

 

  • 将request添加到queue

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

 

3 总结

 

下面将总结Volley的执行流程:在初始化RequestQueue的时候,启动了四个线程NetworkDispatcher,这四个线程不停的从queue中获取request,调用Network来执行该request得到NetworkResponse,然后由request将NetworkResponse转化为Response,最后将request和response交给ResponseDelivery,执行成功后调用request中用户编写的onResponse方法。

 

后面文章将介绍源码分析的一些技巧以及常见问题的解决方案。

Volley源码分析(1)_Java