最近有一個需求,需要App監測網絡變化,並在網絡變化的同時用戶,你切網啦,並且導航至一個切網的特定頁面。
和Android、iOS的小夥伴後共同發現,人家有一個類似”攔截器“的框架,可以攔截App發出的請求,並返回一個特定的操作。
而之前在C#網絡請求的時候,我們的Http Client要麼返回完整的data數據,要麼null。而沒有第三種情況。他們的攔截器可以返回第N中操作。
經過一頓操作猛於虎的查找資料,並沒有找到類似C#的網絡請求框架。
但是C#中的委託應該可以實現我的需求。
不過我對委託不熟悉,而且使用委託的話,對現在App中的所有Api都會有影響,改動範圍大。所以就擱置了這種想法。
後來仔細分析了一下,既然用戶手動觸發切換網絡的操作,那麼App是不是能註冊一個網絡變化的事件,然後等網絡一變,App就立馬收到通知呢?
答案是肯定的。
Uwp中提供了 NetworkInformation.NetworkStatusChanged Event。
後來我在WindowsCommunityToolkit也發現中微軟寫的NetworkHelper,有一個也是同樣的方法。
這樣一來,我們就需要在ShellPage中註冊一下即可。
在ShellPage初始化的時候加入
public ShellPage()
{
InitializeComponent();
NetworkHelper.Instance.NetworkChanged += Instance_NetworkChanged;
}
private async void Instance_NetworkChanged(object sender, EventArgs e)
{
shellFrame.Navigate(typeof(Extras.AreaChangedPage));
}
不過你要是直接運行上面的代碼,App可以正常檢測到網絡變化,並且執行NetWorkChanged事件裏面的代碼。
但是在導航至頁面的時候,會報錯System.Exception。
這是因爲在執行頁面跳轉操作的時候,需要UI線程支持。
但是ShellPage不屬於UI線程裏面的,所以需要Dispatcher.RunAsync
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
shellFrame.Navigate(typeof(Extras.AreaChangedPage));
});