连接方法不会在xamarin表单/ c#中调用

时间:2017-05-30 06:10:43

标签: c# xamarin.forms

我有一个Xamarin Forms应用程序,它应该在检测到Internet连接后触发一个方法来执行。我用过

CrossConnectivity.Current.ConnectivityChanged

监控互联网连接的变化情况。

然后我在页面的构造函数中调用该方法以及需要在页面加载时执行的其他方法。但是当我更改了互联网连接的状态时,方法SendUntransferedData();没有被执行。因此,我的所有未传输数据都不会被传输。任何人都可以帮我解决这个问题,或者为我提供另一种方法吗?

MainPage.cs中的以下代码是:

public MainPage() {
  DoSomething();
  SearchData();
  SendUntransferedData();
 }

代码也在cs中实现。

private void SendUntransferedData()
{
     CrossConnectivity.Current.ConnectivityChanged +=  (sender, args) =>
    {
        DataAccess da = new DataAccess();

         da.SendUntransferredData();
    };
}

2 个答案:

答案 0 :(得分:1)

<强>步骤1:

首先,您需要添加这两个包

Xam.Plugin.Connectivity
plugin.wifiinfo

在所有平台

<强>步骤2:

在PCL中创建一个类。

<强> NetworkCheck.cs

public static bool IsNetworkConnected ()
{
  bool retVal = false;

  try 
  {
    retVal = CrossConnectivity.Current.IsConnected;
    return retVal;
  } 
  catch (Exception ex) {
    System.Diagnostics.Debug.WriteLine (ex.Message);
    throw ex;
  }
}

<强>步骤3:

在您的网页中使用以下代码

if (CheckNetworkAccess.IsNetworkConnected ())
{
    Navigation.PushAsync (new HomePage ());
} 
else
{
    await DisplayAlert ("Your app name", "Please check your network connection", "OK");
}

答案 1 :(得分:0)

我使用的替代方案如下。在我的 App.xaml.cs 文件中,我添加了代码以连接ConnectivityChanged。这样我在我的应用程序中有一个位置可以处理,因为 App.xaml.cs 在我的应用程序的生命周期中始终存在,所以这是放置它的理想位置。

如果连接到CrossConnectivity的事件,然后使用Xamarin Forms MessagingCenter向所有订阅者广播消息。

protected override void OnStart()
{
    // Handle when your app starts
    OnResume();
}

protected override void OnResume()
{
    // Handle when your app resumes
    Settings.IsConnected = CrossConnectivity.Current.IsConnected;
    CrossConnectivity.Current.ConnectivityChanged += ConnectivityChanged;
}

protected override void OnSleep()
{
    // Handle when your app sleeps
    CrossConnectivity.Current.ConnectivityChanged -= ConnectivityChanged;
}

protected async void ConnectivityChanged(object sender, ConnectivityChangedEventArgs e)
{
    // Save current state and then set it
    var connected = Settings.IsConnected;
    Settings.IsConnected = e.IsConnected;

    // If connectivity changes we inform our listeners of that.
    if (connected != e.IsConnected)
        MessagingService.Current.SendMessage(MessageKeys.ConnectivityChanged);

    // If we disconnected, show a message for the user that we did.
    if (connected && !e.IsConnected)
    {
        // We went offline, should alert the user and also update ui (done via settings)
        var task = UserDialogs.Instance.AlertAsync("You are offline.", "Connection lost", "OK");
        if (task != null)
            await task;
    }
}

然后我在基本视图模型中创建一个属性,我的所有其他视图模型都继承该属性。必要时,这可以绑定到界面控件。

public bool IsConnected { get; set; } 

在我的viewmodel中,我订阅了 App.xaml.cs 中抛出的事件。

MessagingService.Current.Subscribe(MessageKeys.ConnectivityChanged, (c) =>
{
     IsConnected = CrossConnectivity.Current.IsConnected;

     // Additional things you want to do such as
     // DataAccess da = new DataAccess();
     // da.SendUntransferredData();
});

根据您使用的MVVM框架(如果使用的话),您可能会进一步抽象这一点,但我不会进入,因为它与原始问题无关。该解决方案使用额外的NuGet包,即:

  • FormsToolkit,其中包含MessagingCenter
  • 的简化版本
  • Settings插件用于存储IsConnected状态。