WearOS中WorkManager执行任务时网络不可用的问题求助
WearOS中WorkManager执行任务时网络不可用的问题求助
各位好,我最近在WearOS应用里遇到一个头疼的问题,想请教下大家。
我做了个后台同步任务,用WorkManager来调度:调用远程API、更新本地Room数据库,还要通知Tile和组件新数据。按照WorkManager的最佳实践,我给任务加了网络连接和低电量的约束,代码如下:
val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresBatteryNotLow(true) .build() val repeatingRequest = PeriodicWorkRequestBuilder<RefreshDataWorker>(20, TimeUnit.MINUTES) .setConstraints(constraints) .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.MINUTES) .build() Log.d("WorkManager", "Periodic Work request for sync is scheduled") WorkManager.getInstance(this).enqueueUniquePeriodicWork( RefreshDataWorker.SCHEDULED_WORK_NAME, ExistingPeriodicWorkPolicy.UPDATE, repeatingRequest )
本来预期是只有当网络连接正常时,任务才会执行,但实际情况是:有时候明明手机/手表的网络是断的,WorkManager却还是触发了任务,导致API调用失败,抛了UnknownHostException。
我翻了Logcat日志,发现了诡异的地方:系统一开始检测到网络是断开的(isConnected=false),但马上又收到了网络能力变化的广播,显示网络已连接且验证通过,于是WorkManager认为约束满足,触发了任务。但任务执行时,实际网络根本没通,我的Worker里检测到没有活跃网络,API调用也因为无法解析主机地址失败了。
下面是相关的Logcat片段:
WM-DelayedWorkTracker com.mypackage D Scheduling work da88277f-b68e-4ab4-90d3-08673582546c WM-GreedyScheduler com.mypackage D Starting tracking for da88277f-b68e-4ab4-90d3-08673582546c WM-ConstraintTracker com.mypackage D a: initial state = true WM-BrdcstRcvrCnstrntTrc com.mypackage D a: registering receiver WM-ConstraintTracker com.mypackage D i: initial state = NetworkState(isConnected=false, isValidated=false, isMetered=true, isNotRoaming=true) WM-NetworkStateTracker com.mypackage D Registering network callback WM-GreedyScheduler com.mypackage D Constraints not met: Cancelling work ID WorkGenerationalId(workSpecId=da88277f-b68e-4ab4-90d3-08673582546c, generation=408) WM-NetworkStateTracker com.mypackage D Network capabilities changed: [ Transports: WIFI Capabilities: NOT_METERED&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED&NOT_VCN_MANAGED LinkUpBandwidth>=9728Kbps LinkDnBandwidth>=37063Kbps TransportInfo: <SSID: <unknown ssid>, BSSID: 02:00:00:00:00:00, MAC: 02:00:00:00:00:00, IP: /192.168.1.101, Security type: 2, Supplicant state: COMPLETED, Wi-Fi standard: 11n, RSSI: -53, Link speed: 72Mbps, Tx Link speed: 72Mbps, Max Supported Tx Link speed: 150Mbps, Rx Link speed: 72Mbps, Max Supported Rx Link speed: 150Mbps, Frequency: 5745MHz, Net ID: -1, Metered hint: false, score: 60, isUsable: true, CarrierMerged: false, SubscriptionId: -1, IsPrimary: -1, Trusted: true, Restricted: false, Ephemeral: false, OEM paid: false, OEM private: false, OSU AP: false, FQDN: <none>, Provider friendly name: <none>, Requesting package name: <none><none>MLO Information: , Is TID-To-Link negotiation supported by the AP: false, AP MLD Address: <none>, AP MLO Link Id: <none>, AP MLO Affiliated links: <none>, Vendor Data: <none>> SignalStrength: -53 UnderlyingNetworks: Null] WM-GreedyScheduler com.mypackage D Constraints met: Scheduling work ID WorkGenerationalId(workSpecId=da88277f-b68e-4ab4-90d3-08673582546c, generation=408) WM-Processor com.mypackage D e: processing WorkGenerationalId(workSpecId=da88277f-b68e-4ab4-90d3-08673582546c, generation=408) WM-WorkerWrapper com.mypackage D Starting work for com.mypackage.work.RefreshDataWorker RefreshDataWorker com.mypackage I No active network. Repository com.mypackage E Failed to refresh data Repository com.mypackage I Exception info: java.net.UnknownHostException: Unable to resolve host "<address>": No address associated with hostname Message: Unable to resolve host "<address>": No address associated with hostname Cause: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname) Class: class java.net.UnknownHostException
我现在的困惑是:为什么WorkManager的网络状态检测和实际情况不一致?明明实际网络是断开的,系统却误判为已连接,导致任务在不满足条件的情况下执行了?有没有人遇到过类似的问题,或者知道可能的原因和解决办法?
内容来源于stack exchange
相关产品推荐
相关产品推荐

