【源码】"拆" 网络请求库-Volley(上)

简介: Volley跟AsyncTask一样,都是老古董了,最早发布于2013年的Google I/O大会,初衷就是:让Android开发者少写重复的请求代码。

0x1、引言


Volley跟AsyncTask一样,都是老古董了,最早发布于2013年的Google I/O大会,初衷就是:让Android开发者少写重复的请求代码


怎么说?早期网络请求都是用 HttpURLConnection 或者 HttpClient,直接用非常麻烦,比如一段请求百度的代码:


private void sendRequest() {
        //开线程发起网络请求
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection conn = null;
                BufferedReader reader = null;
                try {
                    //获取HttpRULConnection实例
                    URL url = new URL("https://www.baidu.com");
                    conn = (HttpURLConnection) url.openConnection();
                    //设置请求方法和自由定制
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(8000);
                    conn.setReadTimeout(8000);
                    //获取响应码和返回的输入流
                    int i = conn.getResponseCode();
                    InputStream in = conn.getInputStream();
                    //对输入流进行读取
                    reader = new BufferedReader(new InputStreamReader(in));
                    StringBuilder response = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null) {
                        response.append(line);
                    }
                    showResponse(response.toString());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (connection != null) {
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }
    // 请求结果展示
    private void showResponse( final String response) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //进行UI操作
                xxx.setText(response);
            }
        });
    }


每个请求都是写上这样一串又长又臭的玩意,写的人死了,看的人也死了,所以一般要封装下。


封装得好也不简单,得去考虑并发,请求取消等等。而Volley所做的事情也是封装,将复杂通信细节封装在内部,开发者仅需写少量代码,即可完成网络请求。


Github仓库,Google竟然还有在维护这个库,而且有API文档 《Volley 概览》,文档中介绍了它的一些优势:


网络异常,图片无法展示
|


使用方法很简单,先在build.gradle中添加依赖:


implementation 'com.android.volley:volley:1.1.1'


然后写段简单的请求示例(官方示例有Kotlin版~)


// 创建请求队列
RequestQueue mQueue = Volley.newRequestQueue(context);
// 构造请求
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中请求的处理流程图:


网络异常,图片无法展示
|


让我们大概知道,Volley中的请求,还支持缓存,命中缓存直接读缓存里的数据,不用再去请求后台。


实际业务开发中,都是OkHttp的天下了,Volley基本绝迹了,也不推荐在项目里用。但其设计思想是可以借鉴的,代码虽简五脏俱全,了解它对后续其他框架的学习也有所裨益,故本节花上亿点点时间来对他进行 拆解


相关文章
|
4月前
|
C++
基于Reactor模型的高性能网络库之地址篇
这段代码定义了一个 InetAddress 类,是 C++ 网络编程中用于封装 IPv4 地址和端口的常见做法。该类的主要作用是方便地表示和操作一个网络地址(IP + 端口)
283 58
|
4月前
|
网络协议 算法 Java
基于Reactor模型的高性能网络库之Tcpserver组件-上层调度器
TcpServer 是一个用于管理 TCP 连接的类,包含成员变量如事件循环(EventLoop)、连接池(ConnectionMap)和回调函数等。其主要功能包括监听新连接、设置线程池、启动服务器及处理连接事件。通过 Acceptor 接收新连接,并使用轮询算法将连接分配给子事件循环(subloop)进行读写操作。调用链从 start() 开始,经由线程池启动和 Acceptor 监听,最终由 TcpConnection 管理具体连接的事件处理。
171 2
|
4月前
基于Reactor模型的高性能网络库之Tcpconnection组件
TcpConnection 由 subLoop 管理 connfd,负责处理具体连接。它封装了连接套接字,通过 Channel 监听可读、可写、关闭、错误等
156 1
|
4月前
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
268 3
|
4月前
基于Reactor模式的高性能网络库github地址
https://github.com/zyi30/reactor-net.git
121 0
|
4月前
基于Reactor模型的高性能网络库之Poller(EpollPoller)组件
封装底层 I/O 多路复用机制(如 epoll)的抽象类 Poller,提供统一接口支持多种实现。Poller 是一个抽象基类,定义了 Channel 管理、事件收集等核心功能,并与 EventLoop 绑定。其子类 EPollPoller 实现了基于 epoll 的具体操作,包括事件等待、Channel 更新和删除等。通过工厂方法可创建默认的 Poller 实例,实现多态调用。
292 60
|
4月前
|
安全 调度
基于Reactor模型的高性能网络库之核心调度器:EventLoop组件
它负责:监听事件(如 I/O 可读写、定时器)、分发事件、执行回调、管理事件源 Channel 等。
285 57
|
4月前
基于Reactor模型的高性能网络库之时间篇
是一个用于表示时间戳(精确到微秒)**的简单封装类
197 57
|
4月前
|
缓存 索引
基于Reactor模式的高性能网络库之缓冲区Buffer组件
Buffer 类用于处理 Socket I/O 缓存,负责数据读取、写入及内存管理。通过预分配空间和索引优化,减少内存拷贝与系统调用,提高网络通信效率,适用于 Reactor 模型中的异步非阻塞 IO 处理。
185 3
|
3月前
|
机器学习/深度学习 算法 数据库
基于GoogleNet深度学习网络和GEI步态能量提取的步态识别算法matlab仿真,数据库采用CASIA库
本项目基于GoogleNet深度学习网络与GEI步态能量图提取技术,实现高精度步态识别。采用CASI库训练模型,结合Inception模块多尺度特征提取与GEI图像能量整合,提升识别稳定性与准确率,适用于智能安防、身份验证等领域。
下一篇
oss云网关配置