4. Android 网络通信概览:HttpURLConnection、OkHttp、Volley 等框架对比

做 Android 开发,网络请求是躲不开的坎。我刚入行那会儿,项目里还在用 HttpClient,后来 Google 一纸令下把它废弃了,大家全跑去用 HttpURLConnection。再后来,OkHttp 和 Retrofit 成了标配。这中间的变化,说白了就是「官方给你什么,你就用什么;但社区总能造出更好用的轮子」。

今天咱们就把这几个主流框架拉出来遛遛。我会结合自己踩过的坑,帮你理清什么时候该用谁。

4.1 原生 HttpURLConnection:最基础的「裸奔」方案

HttpURLConnection 是 Android 自带的网络请求类,从 API 1 就有了。它的优点就一个字:轻。不需要引入任何第三方库,写个简单的 GET 请求也就十几行代码。

// 一个典型的 HttpURLConnection GET 请求
URL url = new URL("https://api.example.com/data");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);

int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(connection.getInputStream()));
    String line;
    StringBuilder response = new StringBuilder();
    while ((line = reader.readLine()) != null) {
        response.append(line);
    }
    reader.close();
}
connection.disconnect();

看着是不是挺直白的?但实际用起来,坑不少。

⚠️ 避坑指南

我曾经在线上项目里直接用 HttpURLConnection 做文件上传,结果发现它在 4.4 以下版本有个 bug——连接复用会导致数据错乱。后来排查了两天才定位到,气得我直接换了 OkHttp。

另外,HttpURLConnection 默认不支持连接池,每次请求都要重新建立 TCP 连接。你想想看,如果 App 里有几十个请求,光握手开销就能把用户流量吃光。

4.2 OkHttp:现代 Android 网络请求的「事实标准」

OkHttp 是 Square 公司开源的网络库,现在已经是 Android 生态的标配了。Retrofit、Glide、Picasso 这些知名库底层都在用它。我个人习惯是:只要项目需要做网络请求,直接上 OkHttp,别犹豫。

为什么它这么受欢迎?核心就三点:

  • 连接池复用:默认支持 5 个并发连接复用,减少握手次数
  • 自动重试:遇到 DNS 失败、连接超时等问题会自动重试
  • 拦截器机制:可以轻松添加日志、缓存、Header 注入等功能
// OkHttp 的典型用法
OkHttpClient client = new OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(10, TimeUnit.SECONDS)
    .addInterceptor(new HttpLoggingInterceptor()
        .setLevel(HttpLoggingInterceptor.Level.BODY))
    .build();

Request request = new Request.Builder()
    .url("https://api.example.com/data")
    .header("Authorization", "Bearer " + token)
    .build();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        // 网络异常处理
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            String body = response.body().string();
            // 解析数据
        }
    }
});
💡 我的经验

我在做 SDK 开发时,经常用 OkHttp 的拦截器来做统一签名。只需要写一个 Interceptor,所有请求自动带上签名参数,省去了在每个请求里手动拼接的麻烦。

OkHttp 对 HTTPS 的支持也很完善。它默认信任系统证书,同时支持自定义证书校验。我记得有个项目需要对接自签名证书的服务器,用 OkHttp 的 CertificatePinner 几行代码就搞定了。

4.3 Volley:Google 官方的「轻量级选手」

Volley 是 Google 在 2013 年推出的网络库,主打「适合数据量小、请求频繁的场景」。它内部封装了请求队列、缓存机制和图片加载,用起来比 HttpURLConnection 顺手不少。

// Volley 的典型用法
RequestQueue queue = Volley.newRequestQueue(context);

StringRequest request = new StringRequest(
    Request.Method.GET,
    "https://api.example.com/data",
    response -> {
        // 成功回调
    },
    error -> {
        // 失败回调
    }
);

queue.add(request);

但说实话,Volley 现在用得越来越少了。原因很简单:它不支持 HTTP/2,也没有连接池。在 5G 时代,App 的网络请求越来越复杂,Volley 的短板就暴露出来了。

⚠️ 注意

Volley 在 Android 4.0 以下版本有内存泄漏问题。如果你还在维护老项目,记得在 Activity 销毁时调用 RequestQueue.cancelAll()

4.4 框架对比:一张表说清楚

特性 HttpURLConnection OkHttp Volley
连接池 ❌ 不支持 ✅ 支持(默认 5 个) ❌ 不支持
HTTP/2 ❌ 不支持 ✅ 支持 ❌ 不支持
自动重试 ❌ 需要手动实现 ✅ 内置 ✅ 内置
拦截器 ❌ 不支持 ✅ 强大 ❌ 不支持
HTTPS 支持 ✅ 基础 ✅ 完善 ✅ 基础
学习成本
社区活跃度

4.5 核心知识体系

下面这张图是我自己整理的,把三个框架的核心差异和适用场景画出来了。你看一眼就能明白,为什么现在大家都选 OkHttp。

Android 网络框架对比 HttpURLConnection • 原生自带,无需依赖 • 无连接池 • 不支持 HTTP/2 • 手动处理重试 • 适合简单请求 ⚠️ 4.4 以下有 bug ⚠️ 无拦截器 OkHttp(推荐) • 连接池复用 • 支持 HTTP/2 • 自动重试机制 • 强大的拦截器 • HTTPS 证书固定 ✅ 社区活跃 ✅ 生态核心 Volley • 请求队列管理 • 内置缓存 • 自动调度线程 • 无连接池 • 不支持 HTTP/2 ⚠️ 内存泄漏风险 ⚠️ 社区停滞 结论:新项目首选 OkHttp,老项目维护看情况,HttpURLConnection 和 Volley 建议迁移

4.6 选型建议

说了这么多,到底该怎么选?我直接给结论:

  • 新项目:无脑上 OkHttp + Retrofit。Retrofit 是对 OkHttp 的进一步封装,用注解定义接口,代码更简洁。
  • 老项目维护:如果还在用 HttpURLConnection,建议逐步迁移到 OkHttp。别等到出问题了再改,那时候成本更高。
  • 极简场景:比如只是偶尔发个统计请求,用 HttpURLConnection 也不是不行。但记得做好异常处理。
  • Volley:除非你还在维护 2015 年之前的项目,否则不建议再用。

📌 核心要点

网络框架的选择,本质上是在「开发效率」和「运行性能」之间做权衡。OkHttp 在这两方面都做到了极致,所以它成了事实标准。你想想看,连 Google 自己都在 Android 源码里用 OkHttp 替换了 HttpURLConnection,这还不够说明问题吗?

好了,这一章的内容就到这里。下一章我们会深入 OkHttp 的源码,看看它的连接池和拦截器到底是怎么工作的。到时候我会拿一个线上案例来拆解,保证让你看得过瘾。


公众号:蓝海资料掘金营,微信deep3321