Android 中使用 OkHttp 创建多个 Client

发布于:2025-06-12 ⋅ 阅读:(23) ⋅ 点赞:(0)

在 Android 开发中,有时我们需要创建多个 OkHttpClient 实例来满足不同的网络请求需求。以下是创建和管理多个 OkHttpClient 的方法:

基本创建方式

// 创建默认的 OkHttpClient
val defaultClient = OkHttpClient()

// 创建带有自定义配置的 Client
val customClient = OkHttpClient.Builder()
    .connectTimeout(30, TimeUnit.SECONDS)
    .readTimeout(30, TimeUnit.SECONDS)
    .writeTimeout(30, TimeUnit.SECONDS)
    .addInterceptor(LoggingInterceptor()) // 添加拦截器
    .build()

创建多个不同配置的 Client

// 快速请求 Client(短超时)
val fastClient = OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(10, TimeUnit.SECONDS)
    .build()

// 大文件下载 Client(长超时)
val downloadClient = OkHttpClient.Builder()
    .connectTimeout(60, TimeUnit.SECONDS)
    .readTimeout(300, TimeUnit.SECONDS)
    .writeTimeout(300, TimeUnit.SECONDS)
    .build()

// 带认证的 Client
val authClient = OkHttpClient.Builder()
    .addInterceptor { chain ->
        val request = chain.request().newBuilder()
            .addHeader("Authorization", "Bearer token_here")
            .build()
        chain.proceed(request)
    }
    .build()

使用单例模式管理多个 Client

object HttpClientManager {
    private val clients = mutableMapOf<String, OkHttpClient>()
    
    // 获取默认 Client
    val defaultClient: OkHttpClient by lazy {
        OkHttpClient.Builder().build().also {
            clients["default"] = it
        }
    }
    
    // 获取或创建指定名称的 Client
    fun getClient(name: String, config: (OkHttpClient.Builder.() -> Unit)? = null): OkHttpClient {
        return clients.getOrPut(name) {
            OkHttpClient.Builder().apply {
                config?.invoke(this)
            }.build()
        }
    }
}

// 使用示例
val fastClient = HttpClientManager.getClient("fast") {
    connectTimeout(10, TimeUnit.SECONDS)
    readTimeout(10, TimeUnit.SECONDS)
}

val authClient = HttpClientManager.getClient("auth") {
    addInterceptor { chain ->
        // 添加认证逻辑
        chain.proceed(chain.request())
    }
}

注意事项

  1. 资源共享:多个 OkHttpClient 实例会创建各自的连接池和线程池,可能会增加资源消耗。

  2. 复用考虑:如果配置差异不大,考虑使用同一个 Client 并通过拦截器动态修改请求。

  3. 生命周期管理:在 Android 中,可以考虑将 OkHttpClient 与 Application 生命周期绑定。

  4. 性能优化:对于大量相似的请求,重用 Client 实例比创建多个更高效。

  5. 清理资源:当不再需要 Client 时,可以调用 client.dispatcher.executorService.shutdown() 来释放资源。

通过合理创建和管理多个 OkHttpClient 实例,可以更好地满足应用中的不同网络请求需求。

下一篇: 创建多个 OkHttpClient 实例 场景-CSDN博客