You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:43:32