Android应用网络恢复后偶发表单无法上传,相关代码是否存在问题?
现有代码的明确问题
- API废弃问题
你当前使用的多个API在Android高版本已经被官方废弃,兼容问题会导致部分设备回调异常:NetworkInfo类从Android 10(API 29)开始正式废弃isConnectedOrConnecting()方法随NetworkInfo同步废弃- 监听网络变化的系统广播
CONNECTIVITY_ACTION从Android 9(API 28)开始禁止静态注册,动态注册方式在高版本也存在漏回调、回调延迟的问题
- 网络判断逻辑漏洞
用isConnectedOrConnecting()判定网络可用是核心错误:该方法返回true仅代表网络处于已连接或正在连接的状态,完全不代表网络可以正常传输数据。比如设备刚切换网络、连接到需要网页认证的公共热点、网络DNS异常时,该方法都会返回true,但实际根本无法发起网络请求,这就是你遇到偶发不提交问题的主要原因。 - 缺少同步触发逻辑
你贴出的代码中,监听到网络状态变为在线后,仅更新了UI和同步按钮的可用状态,没有主动触发本地待提交表单的上传逻辑,即使网络完全正常也不会自动执行同步操作。
修复方案
- 替换旧的网络监听实现
改用ConnectivityManager.NetworkCallback来监听网络状态变化,适配所有Android 5.0及以上版本,回调准确率远高于广播实现,示例代码如下:
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { @Override public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) { super.onCapabilitiesChanged(network, networkCapabilities); // 校验网络实际可用 boolean isAvailable = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); if (isAvailable) { // 网络可用,更新UI networkStatusMenuItem.setTitle("Online"); syncMenuItem.setEnabled(true); // 主动触发待提交表单同步 syncPendingFormFromLocal(); } else { networkStatusMenuItem.setTitle("Offline"); syncMenuItem.setEnabled(false); } } }; // 注册监听 ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); cm.registerDefaultNetworkCallback(networkCallback);
- 增加兜底重试机制
建议配合WorkManager实现后台同步任务,就算上传过程中网络再次中断、APP退到后台,系统也会在满足条件时自动重试,稳定性远高于自行实现的同步逻辑。
内容的提问来源于stack exchange,提问作者Parteek Singh Bedi
相关产品推荐
相关产品推荐

