在 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博客