我们用Volley框架处理网络任务的时候一般都是这样写的:
public void testVolley(){
RequestQueue mQueue = Volley.newRequestQueue(this.getApplicationContext());
StringRequest stringRequest = new StringRequest("http://www.baidu.com",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
mQueue.add(stringRequest);
}
看了Volley的源码之后大概画了一下网络任务的基本走向,如下图:
核心思路是通过两大类工作线程(CacheDispatcher和NetworkDispatcher)不断循环获取任务和维护两个队列(CacheQueue和NetworkQueue)来处理添加的多个网络请求。
主要核心步骤:
1,新增一个网络请求(request)后,该网络请求首先被添加到CacheQueue队列中
2,一个工作线程CacheDispatcher一直循环不停的去CacheQueue队列中获取网络请求(request),当没有网络请求(request)时就阻塞等待,当获取到网络请求(request)时先判断该请求结果是否有缓存,有缓存就直接交付结果,没有缓存就把网络请求(request)放进NetworkQueue队列,然后再继续循环
3,默认开启的四个工作线程NetworkDispatcher全都一直循环不停的去NetworkQueue队列获取网络请求(request),当没有网络请求(request)时就阻塞等待,当拿到网络请求(request)的工作线程NetworkDispatcher就根据网络请求(request)去网络请求数据,拿到数据后先缓存,然后交付结果,最后再继续循环