如何在Android Cronet中设置HTTP响应最大等待时间?
在Cronet中配置HTTP请求超时时间
Cronet提供两种设置请求超时的方式,可根据需求选择全局默认配置或单个请求自定义配置:
1. 全局默认超时(所有请求生效)
初始化CronetEngine时,通过Builder设置全局默认超时时间,所有请求将自动继承该配置:
fun initCronet() { // this is called only once executor = Executors.newSingleThreadExecutor() val globalTimeoutSeconds = 10L // 设置全局默认10秒超时 engine = CronetEngine.Builder(context) .enableHttp2(true) .setDefaultTimeout(globalTimeoutSeconds, TimeUnit.SECONDS) .build() }
2. 单个请求自定义超时(覆盖全局配置)
若需给特定请求设置差异化超时,可在构建UrlRequest时单独配置:
suspend fun myFunction() { suspendCoroutine<HttpResponseContainer> { val callback = CoroutinesNetworkCallback(it) val url = "http://myhost.com/my-endpoint" engine.newUrlRequestBuilder(url, callback, executor) .addHeader("Content-Type", "application/json; charset=UTF-8") .setTimeout(15L, TimeUnit.SECONDS) // 该请求单独设置15秒超时 .build().start() } }
3. 超时后的异常处理
请求超时触发时,Cronet会调用UrlRequest.Callback的onFailed方法,可在该方法中区分超时异常并给出明确提示:
override fun onFailed(request: UrlRequest, info: UrlResponseInfo, error: CronetException) { val exception = when (error.cause) { is SocketTimeoutException -> RuntimeException("请求超时") else -> RuntimeException("请求失败") } continuation.resumeWithException(exception) }
额外:协程层面的双重保障
如果需要更上层的超时控制,可结合协程的withTimeout函数,实现网络引擎+协程的双重超时保障:
suspend fun myFunction() { try { withTimeout(10000L) { // 协程层面10秒超时 suspendCoroutine<HttpResponseContainer> { val callback = CoroutinesNetworkCallback(it) val url = "http://myhost.com/my-endpoint" engine.newUrlRequestBuilder(url, callback, executor) .addHeader("Content-Type", "application/json; charset=UTF-8") .build().start() } } } catch (e: TimeoutCancellationException) { throw RuntimeException("请求超时") } }
内容的提问来源于stack exchange,提问作者Bravo
相关产品推荐
相关产品推荐

