下面我将为你详细梳理 Android 网络访问的演进史和各种主流方式,并提供关键代码示例。

网络访问方式的演进
| 时代/方式 | 核心特点 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
| 远古时代 (API < 9) | HttpClient (Apache) |
功能强大,API 丰富 | 已被废弃,存在安全漏洞,不再推荐 | 旧项目维护 |
| 上古时代 (API 9+) | HttpURLConnection |
轻量级,系统自带 | API 较为繁琐,处理异步、回调代码量大 | 简单的、不需要复杂库的网络请求 |
| 现代时代 | OkHttp | 高性能,支持 HTTP/2, SPDY, 连接池 | 需要作为依赖引入,本身是网络连接库 | 当前 Android 开发的事实标准,几乎所有的网络请求都基于它 |
| 现代时代 | Retrofit | 接口化调用,自动解析 JSON/Gson,集成 OkHttp | 依赖于 OkHttp,是一个网络请求封装库 | 最主流的 API 请求框架,与 OkHttp 黄金搭档 |
| 现代时代 (Kotlin) | Ktor | 由 JetBrains 出品,完全使用 Kotlin 编写,协程友好 | 需要引入 Ktor 全家桶,在 Java 中使用不便 | Kotlin 原生项目,或需要高度定制网络层 |
| 现代时代 (Google 推荐) | AndroidX Ktx | 使用 Kotlin 协程,代码极其简洁 | 仅支持 Kotlin,功能相对基础 | 快速实现简单的网络请求,学习成本低 |
各种方式详解与代码示例
HttpURLConnection (系统原生)
这是 Android SDK 自带的网络类,无需添加任何依赖,在 Android 9 (API 28) 及以上版本,默认禁止使用明文 HTTP 流量,需要在 AndroidManifest.xml 中配置 usesCleartextTraffic。
特点:
- 同步调用,必须在子线程中执行,否则会抛出
NetworkOnMainThreadException。 - API 相对原始,需要手动处理输入流、输出流和连接状态。
代码示例 (在子线程中使用):
// 在 Activity 或 Fragment 中
new Thread(new Runnable() {
@Override
public void run() {
try {
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) {
InputStream inputStream = connection.getInputStream();
String result = streamToString(inputStream);
// 通过 Handler 切换回主线程更新 UI
runOnUiThread(() -> textView.setText(result));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
// 辅助方法:将输入流转换为字符串
private String streamToString(InputStream is) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
is.close();
return stringBuilder.toString();
}
Kotlin 协程版本 (更简洁):

// 在 Activity 或 Fragment 中
lifecycleScope.launch(Dispatchers.IO) {
try {
val url = URL("https://api.example.com/data")
val connection = url.openConnection() as HttpURLConnection
connection.requestMethod = "GET"
connection.connectTimeout = 5000
connection.readTimeout = 5000
if (connection.responseCode == HttpURLConnection.HTTP_OK) {
val result = connection.inputStream.bufferedReader().use { it.readText() }
// withContext(Dispatchers.Main) 切换回主线程更新 UI
withContext(Dispatchers.Main) {
textView.text = result
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
OkHttp (网络连接层)
OkHttp 是一个高效的 HTTP & HTTP/2 客户端,它负责底层的网络连接、Socket 管理和请求分发,Retrofit 通常就是用它作为底层引擎。
特点:
- 支持同步和异步请求。
- 自动管理连接池,复用 TCP 连接,性能优异。
- 支持 GZIP 压缩。
- 内置缓存机制。
- 拦截器 机制非常强大,可以统一处理日志、Token、重试等。
添加依赖 (build.gradle):
implementation("com.squareup.okhttp3:okhttp:4.12.0") // 请使用最新版本
代码示例 (异步 GET 请求):

val client = OkHttpClient()
val request = Request.Builder()
.url("https://api.example.com/data")
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
// 请求失败,在子线程执行
e.printStackTrace()
}
override fun onResponse(call: Call, response: Response) {
// 请求成功,在子线程执行
response.use { it ->
if (!it.isSuccessful) throw IOException("Unexpected code $it")
val body = it.body?.string()
// 通过 Handler 或 LiveData 切换到主线程更新 UI
runOnUiThread {
textView.text = body
}
}
}
})
Retrofit (API 请求封装层)
Retrofit 不是一个网络客户端,它是一个 RESTful API 的类型安全 HTTP 客户端,它将 HTTP API 转换成一个 Java/Kotlin 接口,并用动态代理来生成实现。
特点:
- 接口化定义 API,代码清晰易读。
- 支持多种数据解析器 (Gson, Moshi, Jackson, Protobuf 等)。
- 支持多种适配器 (Call, RxJava, Coroutines, Flow)。
- 与 OkHttp 无缝集成。
添加依赖 (build.gradle):
// Retrofit 核心库
implementation("com.squareup.retrofit2:retrofit:2.9.0") // 请使用最新版本
// JSON 解析器 (Gson)
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
// 协程支持适配器
implementation("com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2") // 或使用 Retrofit 内置的
// 或者使用 Retrofit 2.6+ 内置的协程支持,无需额外适配器
代码示例 (结合 OkHttp 和 Gson):
定义 API 接口:
interface ApiService {
@GET("data")
suspend fun getData(): Response<List<DataItem>> // 使用 suspend 函数,返回 Response 对象
}
创建 Retrofit 实例并调用 API:
// 创建 OkHttp 客户端
val okHttpClient = OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.build()
// 创建 Retrofit 实例
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.client(okHttpClient) // 关联 OkHttp
.addConverterFactory(GsonConverterFactory.create()) // 添加 JSON 解析器
.build()
// 创建 API 服务实例
val apiService = retrofit.create(ApiService::class.java)
// 在协程中调用
lifecycleScope.launch {
try {
val response = apiService.getData()
if (response.isSuccessful) {
val data = response.body()
// 切换到主线程更新 UI
withContext(Dispatchers.Main) {
textView.text = data?.toString()
}
} else {
// 处理错误响应
Log.e("Retrofit", "Error: ${response.code()}")
}
} catch (e: Exception) {
// 处理网络异常等
Log.e("Retrofit", "Exception: ${e.message}")
}
}
AndroidX Ktx (Google 官方简化方案)
对于一些非常简单的网络请求,Google 推荐使用 kotlinx-coroutines 和 androidx.lifecycle:lifecycle-runtime-ktx 来简化代码。
特点:
- 代码量最少,非常简洁。
- 基于 Kotlin 协程,天然支持挂起函数,没有回调地狱。
- 适合快速原型开发或简单的网络任务。
添加依赖 (build.gradle):
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") // 包含了 viewModelScope, lifecycleScope 等
代码示例:
// 在 Activity 或 Fragment 中
lifecycleScope.launch {
// 使用 IO 调度器执行网络请求
val result = withContext(Dispatchers.IO) {
// 这里可以是用 OkHttp 发起的请求,或者任何其他阻塞式 IO
URL("https://api.example.com/data").readText()
}
// withContext 执行完毕后,自动回到主线程
textView.text = result
}
注意: 虽然这种方式代码简洁,但底层网络实现依然需要你自己处理(比如用 OkHttp),它只是帮你解决了线程切换和生命周期管理的样板代码。
如何选择?
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 新项目开发 (Kotlin) | Retrofit + OkHttp + Kotlinx Coroutines | 黄金组合,功能强大,生态完善,代码优雅,类型安全,是目前业界最主流、最成熟的方案。 |
| 新项目开发 (Java) | Retrofit + OkHttp + RxJava | Java 生态下的最佳实践,RxJava 提供了强大的异步编程能力,可以优雅地处理复杂的异步事件流。 |
| 简单的 Demo 或原型 | AndroidX Ktx + OkHttp | 代码量最少,能快速实现功能,专注于业务逻辑本身。 |
| 需要高度定制化网络层 | Ktor | 如果你是一个 Kotlin 重度用户,并且希望从网络层到业务层都使用 Kotlin 的特性,Ktor 是一个非常好的选择。 |
| 维护旧项目 | HttpURLConnection 或旧版 HttpClient |
如果项目非常老旧,不想引入新依赖,且网络逻辑简单,可以继续使用,但新项目绝对不要使用。 |
重要注意事项
-
网络线程:所有网络请求都是耗时操作,绝对不能在主线程(UI 线程)中执行,否则会导致应用卡顿甚至被系统杀死(
NetworkOnMainThreadException),必须使用Thread,AsyncTask(已废弃),ExecutorService,HandlerThread或Kotlin 协程来处理。 -
网络安全:
- HTTPS:从 Android 9 (API 28) 开始,默认只允许 HTTPS 通信,如果你的 API 是 HTTP,需要在
AndroidManifest.xml的<application>标签中添加android:usesCleartextTraffic="true"。 - 网络安全配置 (Network Security Configuration):推荐使用,可以自定义网络安全策略,如信任特定证书、禁用明文流量等,增强应用安全性。
- HTTPS:从 Android 9 (API 28) 开始,默认只允许 HTTPS 通信,如果你的 API 是 HTTP,需要在
-
权限:应用必须有访问网络的权限。
<!-- 在 AndroidManifest.xml 中 --> <uses-permission android:name="android.permission.INTERNET" />
-
数据解析:推荐使用 Gson、Moshi 或 Jackson 等库来解析 JSON,它们比手动解析更高效、更可靠。
对于 2025 年及以后的 Android 开发,Retrofit + OkHttp + Kotlin 协程 是最值得推荐和学习的网络访问方案,它结合了类型安全、高性能、代码简洁和强大的生态系统,能够应对绝大多数复杂的网络场景,而 AndroidX Ktx 则是处理简单网络任务的利器,能让你的代码更加清爽。
