android - Xamarin.Forms 如何显示互联网连接已更改?

标签 android ios xamarin xamarin.android xamarin.forms

我的应用程序的结构:

public partial class App : Application
  {

    public App()
    {
      InitializeComponent();

      MainPage = new MdpMainPage();
    }

MdpMainPage 是一个 MasterDetailPage:

<MasterDetailPage.Detail>
    <NavigationPage>
        <x:Arguments>
            <pages:HomePage />
        </x:Arguments>
    </NavigationPage>
</MasterDetailPage.Detail>

我的主页是一个 CarouselPage,它包含三个类型为 ContentPage 的页面。

<CarouselPage>
    ...some namespaces...
    <CarouselPage.Children>
        <pages:HomePageA />
        <pages:HomePageB />
        <pages:HomePageC />
    </CarouselPage.Children>
</CarouselPage>

我想使用 JamesMontemagno 的 ConnectivityPlugin 来观察互联网连接变化。

应用程序启动时应该弹出 DisplayAlert 框,它应该告诉我们:

DisplayAlert("Internet connection found.", "Wait for the application data to update.", "OK");

……或者……

DisplayAlert("No internet connection found.", "Application data may not be up to date. Connect to a working network.", "OK");


如果在应用程序开始时有互联网连接并且在应用程序的使用过程中丢失,应该弹出另一个消息框说:

DisplayAlert("Internet connection lost.", "Application data may not be up to date. Connect to a working network.", "OK");


如果在应用程序开始时没有互联网连接并且之后设备成功连接,则应该出现第一个提到的消息框:

DisplayAlert("Internet connection found.", "Wait for the application data to update.", "OK");


我试图在提供的 Documentation 的帮助下找出正确的实现方式.
不幸的是,James Montemagno 没有费心详细解释如何使用 ConnectivityPlugin,所以像我这样的初学者往往会感到困惑。

我知道我应该使用以下代码 fragment :

/// <summary>
/// Event handler when connection changes
/// </summary>
event ConnectivityChangedEventHandler ConnectivityChanged; 


public class ConnectivityChangedEventArgs : EventArgs
{
  public bool IsConnected { get; set; }
}

public delegate void ConnectivityChangedEventHandler(object sender, ConnectivityChangedEventArgs e);

CrossConnectivity.Current.ConnectivityChanged += async (sender, args) =>
{
  Debug.WriteLine($"Connectivity changed to {args.IsConnected}");
};

...但我不知道将它们放在哪里

我尝试了几种组合,但到目前为止都无济于事。

我是否将一些放在 App.xaml 中,一些放在 MasterDetailPage 中?

或者更确切地说是详细信息页面之一?

还是在每个详情页?

请不要以为我没有用谷歌搜索。因为我做了,而且每个人似乎对如何为基本的 Montemagno 食谱调味都有不同的看法,这非常令人困惑。

有人能提供最简单、最干净的实现方法吗?没什么特别的,只是通知用户连接变化的消息框。

帮助将不胜感激。
谢谢大家。

最佳答案

假设您的应用程序中有十几个页面。在所有这些中都有连接代码是没有意义的。订阅事件的更好位置是 OnStart 方法中的 App.xaml.cs(也可以在构造函数中)。这是我在其中一个项目中拥有的:

protected override void OnStart()
{
    CrossConnectivity.Current.ConnectivityChanged += (sender, args) =>
    {
        MessagingService.Current.SendMessage("connectivityChanged", args.IsConnected);
    };
}

MessagingService来自 James Montemagno 的 Xamarin.Forms 工具包,但您也可以使用 Xamarin 的 Messaging Center .

然后,在那些想要订阅此连接更改消息的页面的每个 ViewModel 上,将像这样订阅它:

MessagingService.Current.Subscribe ("connectivityChanged", async (e) => 
{
    //Show a dialog or something to inform about the connectivity change.
});

这样你就可以解耦一切。


编辑:我刚刚注意到您可能希望从页面后面的代码中显示警报。您可以像这样简单地在 MasterDetailPage 上订阅事件:

public class MainPageCS : MasterDetailPage
{
    public MainPageCS() 
    {
        MessagingService.Current.Subscribe<bool>("connectivityChanged", (args, connected) =>
        {
            if (connected)
                DisplayAlert("Internet connection found.", "Wait for the application data to update.", "OK");
            else
                DisplayAlert("Internet connection lost.", "Application data may not be up to date. Connect to a working network.", "OK");
        });
    }
}

只要连接发生变化,您的 App.xaml.cs 就会处理该事件并向 MessagingService 发送消息,MasterDetailPage 会接收该消息并对其作出 react 。

编辑 2:将其放入您的 App.xaml.cs,以便仅在应用启动时检查连接。

protected override void OnStart()
{
    Device.BeginInvokeOnMainThread(async () =>
    {
        var isConnected = CrossConnectivity.Current.IsConnected;

        await MainPage.DisplayAlert("Connection", $"Connected {isConnected}", "OK");
    });
}

关于android - Xamarin.Forms 如何显示互联网连接已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45960529/

相关文章:

android - 使用 Android 12knownSigner 保护级别标志

Android最快的列表行绘图布局

ios - 为什么我无法在新的 iPad Xamarin 应用程序中构建?

android - java.exe 已退出,代码为 2 (MSB6006) 无法写入输出 : Too many field references: 81626; max is 65536

Android sqlite 查询与 AND

java - 在 Android Studio 上将模块或项目作为库导入

ios - 获取结果 Controller 委托(delegate)在 swift 1.2/xcode 6.3 更新后未调用

ios - UITableView 通过内容偏移获取中间位置

ios - 单点触控 : very simple webView code

Android MapFragment 调整大小动画断断续续/滞后