Android 中使用 OkHttp 创建多个 Client
在 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>()// 获取默认 Clientval defaultClient: OkHttpClient by lazy {OkHttpClient.Builder().build().also {clients["default"] = it}}// 获取或创建指定名称的 Clientfun 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())}
}
注意事项
-
资源共享:多个 OkHttpClient 实例会创建各自的连接池和线程池,可能会增加资源消耗。
-
复用考虑:如果配置差异不大,考虑使用同一个 Client 并通过拦截器动态修改请求。
-
生命周期管理:在 Android 中,可以考虑将 OkHttpClient 与 Application 生命周期绑定。
-
性能优化:对于大量相似的请求,重用 Client 实例比创建多个更高效。
-
清理资源:当不再需要 Client 时,可以调用
client.dispatcher.executorService.shutdown()
来释放资源。
通过合理创建和管理多个 OkHttpClient 实例,可以更好地满足应用中的不同网络请求需求。
下一篇: 创建多个 OkHttpClient 实例 场景-CSDN博客