.NET MAUI中ConnectivityChanged Handler网络切换时未触发问题
问题解决:Android 14下ConnectivityChanged事件不触发的修复方案
1. 补全Android权限配置
Android 14(API 34)对网络权限有明确要求,必须在AndroidManifest.xml中声明必要权限,否则无法监听网络状态变化:
<!-- 允许获取网络状态 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 若需访问互联网,需添加此权限 --> <uses-permission android:name="android.permission.INTERNET" />
注:ACCESS_NETWORK_STATE属于Android 13+的正常权限,无需动态申请,但必须在清单文件中声明。
2. 修正事件订阅的生命周期问题
ViewModel的生命周期与页面不同步,直接在ViewModel构造函数中绑定全局事件可能导致订阅失效。建议在页面的生命周期方法中管理事件的订阅与取消:
页面代码示例(如MainPage.xaml.cs)
protected override void OnAppearing() { base.OnAppearing(); // 页面显示时订阅事件 Connectivity.ConnectivityChanged += ViewModel.ConnectivityHandler; } protected override void OnDisappearing() { base.OnDisappearing(); // 页面隐藏时取消订阅,避免内存泄漏 Connectivity.ConnectivityChanged -= ViewModel.ConnectivityHandler; }
同时将ViewModel中的ConnectivityHandler修改为public或内部可见的访问级别。
3. 优化事件处理器逻辑
直接使用事件参数e.NetworkAccess判断网络状态,比调用全局Connectivity.NetworkAccess更准确及时:
private async void ConnectivityHandler(object sender, ConnectivityChangedEventArgs e) { if (e.NetworkAccess == NetworkAccess.Internet) { InternetConnected = true; await _toastService.ShowToast("Back Online", ToastDuration.Short, 20); await GetAllUsers(); IsRefreshing = false; } else { InternetConnected = false; } }
4. 调试排查技巧
- 在事件处理器开头添加调试日志,确认事件是否触发:
private async void ConnectivityHandler(object sender, ConnectivityChangedEventArgs e) { System.Diagnostics.Debug.WriteLine($"网络状态变更:{e.NetworkAccess}"); // 后续逻辑... } - 在ViewModel构造函数中添加日志,确认事件订阅代码是否执行:
public UserViewModel(...) { // ...其他初始化代码 System.Diagnostics.Debug.WriteLine("ViewModel已初始化,绑定ConnectivityChanged事件"); Connectivity.ConnectivityChanged += ConnectivityHandler; } - 测试时覆盖多种网络场景:切换WiFi、移动数据、飞行模式,确保触发条件全面。
5. 确认MAUI版本兼容性
确保使用的MAUI版本支持Android 14,建议升级至最新稳定版,避免已知的网络监听兼容性bug。
内容的提问来源于stack exchange,提问作者Pratik Panchal
相关产品推荐
相关产品推荐

