在 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())
}
}
注意事项
资源共享:多个 OkHttpClient 实例会创建各自的连接池和线程池,可能会增加资源消耗。
复用考虑:如果配置差异不大,考虑使用同一个 Client 并通过拦截器动态修改请求。
生命周期管理:在 Android 中,可以考虑将 OkHttpClient 与 Application 生命周期绑定。
性能优化:对于大量相似的请求,重用 Client 实例比创建多个更高效。
清理资源:当不再需要 Client 时,可以调用
client.dispatcher.executorService.shutdown()
来释放资源。
通过合理创建和管理多个 OkHttpClient 实例,可以更好地满足应用中的不同网络请求需求。