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。
4.6 选型建议
说了这么多,到底该怎么选?我直接给结论:
- 新项目:无脑上 OkHttp + Retrofit。Retrofit 是对 OkHttp 的进一步封装,用注解定义接口,代码更简洁。
- 老项目维护:如果还在用 HttpURLConnection,建议逐步迁移到 OkHttp。别等到出问题了再改,那时候成本更高。
- 极简场景:比如只是偶尔发个统计请求,用 HttpURLConnection 也不是不行。但记得做好异常处理。
- Volley:除非你还在维护 2015 年之前的项目,否则不建议再用。
📌 核心要点
网络框架的选择,本质上是在「开发效率」和「运行性能」之间做权衡。OkHttp 在这两方面都做到了极致,所以它成了事实标准。你想想看,连 Google 自己都在 Android 源码里用 OkHttp 替换了 HttpURLConnection,这还不够说明问题吗?
好了,这一章的内容就到这里。下一章我们会深入 OkHttp 的源码,看看它的连接池和拦截器到底是怎么工作的。到时候我会拿一个线上案例来拆解,保证让你看得过瘾。
公众号:蓝海资料掘金营,微信deep3321