Android WorkManager移动网络下HTTP连接频繁失败问题求助
解决WorkManager移动网络休眠环境下HTTP连接异常问题
问题原因
设备处于未充电、屏幕关闭的移动网络环境时,系统会触发移动数据低功耗策略,即便WorkManager的NetworkType.CONNECTED约束已满足,实际网络链路仍可能出现DNS解析失败、连接中断等不稳定情况,从而抛出SocketException或UnresolvedAddressException。
可行解决方法
增强HTTP请求容错性
给HTTP请求添加重试机制与合理的超时配置,应对临时网络波动。以OkHttp为例,可添加重试拦截器:val client = OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .addInterceptor(RetryInterceptor(maxRetryCount = 3)) .build() class RetryInterceptor(private val maxRetryCount: Int) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() var response: Response? = null var retryCount = 0 var exception: IOException? = null while (retryCount < maxRetryCount) { try { response = chain.proceed(request) if (response.isSuccessful) { return response } } catch (e: IOException) { exception = e } finally { response?.close() } retryCount++ Thread.sleep(1000) } throw exception ?: IOException("Max retry reached") } }主动验证网络可用性
在工作器执行HTTP请求前,通过ConnectivityManager验证网络是否具备真实互联网访问能力(而非仅连接到网络):fun isNetworkAvailable(context: Context): Boolean { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val network = connectivityManager.activeNetwork ?: return false val networkCapabilities = connectivityManager.getNetworkCapabilities(network) ?: return false return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) }在
ProcessScheduledMessage的doWork()方法中,先调用该方法确认网络可用后再执行请求;若不可用则返回Result.retry(),让WorkManager稍后重试。调整WorkManager配置
给WorkRequest添加重试策略,允许网络异常时自动重试:val scheduleRequest = OneTimeWorkRequestBuilder<ProcessScheduledMessage>() // ... 原有配置 .setBackoffCriteria( BackoffPolicy.LINEAR, OneTimeWorkRequest.MIN_BACKOFF_MILLIS, TimeUnit.MILLISECONDS ) .build()同时可添加
setRequiresBatteryNotLow(true)约束,避免在电池极低的场景下执行,降低网络不稳定概率。
注意事项
不要仅依赖WorkManager的NetworkType.CONNECTED约束判断网络可用性,该约束仅保证设备已连接到网络,不保证网络具备互联网访问能力。
内容的提问来源于stack exchange,提问作者Bink
相关产品推荐
相关产品推荐

