欢迎点击「算法与编程之美」↑关注我们!
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());
做的工作主要有:
-
使用默认的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方法。
后面文章将介绍源码分析的一些技巧以及常见问题的解决方案。