睿诚科技协会

Android网络访问方式有哪些?

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

Android网络访问方式有哪些?-图1
(图片来源网络,侵删)

网络访问方式的演进

时代/方式 核心特点 优点 缺点 推荐场景
远古时代 (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 协程版本 (更简洁):

Android网络访问方式有哪些?-图2
(图片来源网络,侵删)
// 在 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 请求):

Android网络访问方式有哪些?-图3
(图片来源网络,侵删)
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-coroutinesandroidx.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 如果项目非常老旧,不想引入新依赖,且网络逻辑简单,可以继续使用,但新项目绝对不要使用。

重要注意事项

  1. 网络线程:所有网络请求都是耗时操作,绝对不能在主线程(UI 线程)中执行,否则会导致应用卡顿甚至被系统杀死(NetworkOnMainThreadException),必须使用 Thread, AsyncTask (已废弃), ExecutorService, HandlerThreadKotlin 协程 来处理。

  2. 网络安全

    • HTTPS:从 Android 9 (API 28) 开始,默认只允许 HTTPS 通信,如果你的 API 是 HTTP,需要在 AndroidManifest.xml<application> 标签中添加 android:usesCleartextTraffic="true"
    • 网络安全配置 (Network Security Configuration):推荐使用,可以自定义网络安全策略,如信任特定证书、禁用明文流量等,增强应用安全性。
  3. 权限:应用必须有访问网络的权限。

    <!-- 在 AndroidManifest.xml 中 -->
    <uses-permission android:name="android.permission.INTERNET" />
  4. 数据解析:推荐使用 Gson、Moshi 或 Jackson 等库来解析 JSON,它们比手动解析更高效、更可靠。

对于 2025 年及以后的 Android 开发,Retrofit + OkHttp + Kotlin 协程 是最值得推荐和学习的网络访问方案,它结合了类型安全、高性能、代码简洁和强大的生态系统,能够应对绝大多数复杂的网络场景,而 AndroidX Ktx 则是处理简单网络任务的利器,能让你的代码更加清爽。

分享:
扫描分享到社交APP
上一篇
下一篇