检测网络连接

已完成

移动设备使用 Wi-Fi 和手机网络技术连接到 Internet。 这意味着,用户在使用应用程序时可能丢失 Internet 连接。 如果不添加相关代码用于防止这种可能性,应用可能会停止响应并为用户带来糟糕的体验。

在本单元中,通过检测用户何时丢失 Internet 连接来保护应用程序。 当我们开始使用 REST Web 服务时,此信息变得很重要。

为什么要检测移动应用程序上的网络连接?

检测移动应用程序上是否有 Internet 连接很重要,因为移动设备经常会断开连接。 这可能是由于网络服务提供商的覆盖范围较小,或者处于接收有限或无法接收的环境中,例如隧道、深谷或高山。 还有不同类型的网络连接。 如果位于提供 WiFi 连接的环境中,那么通常拥有比依赖蜂窝网络访问更高的带宽。 也许仍然能够连接到 Internet,但与 WiFi 连接相比,通过蜂窝网络链接进行的某些操作(例如流式传输视频内容)可能速度变慢(且成本高昂)。

因为移动设备面临这些挑战,所以必须编写相关代码来避免这些问题。 如果不这样做,应用程序在尝试执行要使用 Internet 的操作时,可能会停止响应。

你还会想要在应用程序无法连接到 Internet 时提供良好的用户体验。 如果应用程序因没有 Internet 服务而停止工作,用户可能会感到困扰。 最好的办法是向用户提供相关信息。 告诉他们没有 Internet 连接,并且应用程序在没有 Internet 连接的情况下可能无法提供全部功能。 下图显示了一个示例:

Screenshot of an app showing a warning about limited network connectivity.

在本示例中,应用程序开发人员告知用户他们没有 Internet 连接,且他们应尝试连接到 Wi-Fi。

检测网络连接

要检查 .NET MAUI 应用中的网络连接,请使用 Connectivity 类。 该类公开了一个名为 NetworkAccess 的属性和一个名为 ConnectivityChanged 的事件。 可以使用这些成员来检测网络中的变化。

通过另一个名为 Current 的属性访问 NetworkAccess 属性。 这是 Connectivity 用于访问平台特定实现的机制。

NetworkAccess 属性返回来自 NetworkAccess 枚举的值。 该枚举有五个值:ConstrainedInternetInternetLocalNoneUnknown。 如果 NetworkAccess 属性返回值 NetworkAccess.None,那么你将知道未连接到 Internet,并且不应运行网络代码。 这种机制可以跨平台移植。 请参阅以下代码示例:

if (Connectivity.Current.NetworkAccess == NetworkAccess.None)
{
    ...
}

还能够通过 ConnectivityChanged 事件确定设备是否已连接到 Internet。 ConnectivityChanged 事件会在网络状态发生变化时自动触发。 例如,如果开始使用时网络连接有效,但最后丢失网络连接,则会引发 ConnectivityChanged 事件以通知有关更改的信息。 传递给 ConnectivityChanged 事件处理程序的参数之一是 ConnectivityChangedEventArgs 对象。 此对象包含一个名为 IsConnected 的属性。 可以使用 IsConnected 属性来确定是否连接到 Internet。 下面是一个示例:

Connectivity.Current.ConnectivityChanged += Connectivity_ConnectivityChanged;
...
void Connectivity_ConnectivityChanged(object sender, ConnectivityChangedEventArgs  e)
{
    bool stillConnected = e.IsConnected;
}

可通过 ConnectivityChanged 事件编写可以检测网络状态变化的应用,并根据不同环境无缝调整可用功能。

知识检查

1.

在运行网络代码前,以下哪一项是检查是否已连接到 Internet 的最佳原因?

2.

假设你正在编写用户可以在车辆行驶时运行的应用程序。 如果车辆进入隧道,设备可能会断开 Internet 连接。 应该使用 Connectivity 类的哪个成员来检测网络连接的变化?”