Volley源码分析(一)

简介: Volley源码分析(一)

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方法。


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

目录
相关文章
|
ARouter
ARouter 源码分析1
ARouter 源码分析
|
ARouter
ARouter 源码分析2
ARouter 源码分析
|
Java Android开发
Android之AsyncTask 源码阅读
Android之AsyncTask 源码阅读
Android之AsyncTask 源码阅读
|
Android开发 Java 数据格式
DialogFragment源码分析
目录介绍 1.最简单的使用方法 1.1 官方建议 1.2 最简单的使用方法 1.3 DialogFragment做屏幕适配 2.源码分析 2.1 DialogFragment继承Fragment 2.
1189 0
|
JSON 数据格式
Volley使用原理笔记
Volley使用原理笔记
IntentService源码分析
我们知道Service是运行在主线程的,主线程中不能进行耗时操作,否则会发生ANR。Service中的发生ANR的超时时间是20s。 有时候我们需要应用在后台默默做一些任务,例如上传文件等。如果我们采用Service,则需要我们自己手动开启新的线程。如果我们不想 自己开启线程怎么办,IntentService就出现了。
|
Android开发 数据格式 XML
volley框架使用小Demo
MainActivity public class MainActivity extends AppCompatActivity { private static final String URL = "https://www.
1006 1
关于volley的使用
https://blog.csdn.net/qwm8777411/article/details/45770979
717 0
|
缓存
Volley源码解析
Volley是一款轻量级的网络访问框架,适合小批量的数据传输。Volley的使用通过newRequestQueue创建一个RequestQueue对象,并调用RequestQueue.add方法来提交任务。
1085 0
|
Android开发
BroadcastReceiver的源码分析
android提供了广播机制,通过BroadcastReceiver可以在不同的进程间传递消息。类似于观察者模式,A应用通过注册广播表示A对消息subject感兴趣,当B应用发出subject类型的消息的时候,A应用就能收到对应的消息。
1324 0