2017-05-30 3 views
1

Ich habe eine Xamarin Forms-Anwendung, die eine Methode auslösen soll, sobald es Internet Connectivity erkennt. Ich habe verwendetConnectivity-Methode wird nicht in Xamarin Forms/c aufgerufen #

CrossConnectivity.Current.ConnectivityChanged 

zu überwachen Internetkonnektivität Änderungen, die gut funktioniert.

Ich rufe dann die Methode im Konstruktor der Seite zusammen mit anderen Methoden, die beim Laden der Seite ausgeführt werden müssen. Aber wenn ich den Status der Internetverbindung änderte, wird die Methode SendUntransferedData(); nicht ausgeführt. Daher werden alle meine nicht übertragenen Daten nicht übertragen. Kann mir bitte jemand helfen, dieses Problem zu lösen oder mir einen alternativen Weg zu geben?

Der folgende Code in MainPage.cs sind:

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

Der Code im cs auch umgesetzt wird.

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

     da.SendUntransferredData(); 
    }; 
} 

Antwort

1

Schritt 1:

Zuerst müssen Sie diese beiden Pakete

Xam.Plugin.Connectivity 
plugin.wifiinfo 

in allen Plattformen hinzuzufügen

Schritt 2:

ein c erstellen Mädchen in 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; 
    } 
} 

Schritt 3:

In Ihrer Seiten verwenden Sie den Code unten

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

Nein. Ich möchte eine Art Hintergrunddienst, der die Internetkonnektivität in der App überwacht. Sobald die Verbindung wieder hergestellt ist, wird automatisch die Methode 'da.SendUntransferedData() ausgelöst;' ' – jones

1

Die Alternative I die folgenden. In meiner App.xaml.cs Datei füge ich den Code hinzu, um den ConnectivityChanged anzuschließen. Auf diese Weise habe ich einen Punkt in meiner App, wo dies behandelt wird und seit App.xaml.cs immer um die Lebensdauer meiner App ist es ein idealer Ort, um dies zu setzen.

Wenn sich die Ereignisse an CrossConnectivity anhängen und dann die Xamarin-Formulare MessagingCenter verwenden, um eine Nachricht an alle Abonnenten zu senden.

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; 
    } 
} 

Ich erstelle dann eine Eigenschaft in einem Basis-Viewmodel, die alle meine anderen Viewmodels erben. Dies kann bei Bedarf an Schnittstellensteuerelemente gebunden sein.

public bool IsConnected { get; set; } 

In meinem Viewmodel ich dann auf das Ereignis abonnieren, die in App.xaml.cs geworfen wird.

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

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

Sie könnten wahrscheinlich abstrakt dies ein wenig weiter in Abhängigkeit von der MVVM Rahmen Sie verwenden (falls Sie eine verwenden), aber ich werde nicht darauf eingehen, da es auf die ursprüngliche Frage in keinem Zusammenhang ist. Diese Lösung verwendet zusätzliche NuGet Pakete nämlich:

  • FormsToolkit, die eine vereinfachte Version des MessagingCenter
  • Settings Plugin den IsConnected Zustand zu speichern hat.
+0

Ich habe folgende CrossConnectivity.Current.ConnectivityChanged + = (Absender, Argumente) => { if (args .IsConnected) { DatabaseAccess dba = new DatabaseAccess(); dba.SendUntransferedData(); } }; ' Aber die Methode' SendUntransferedData' wird nicht ausgeführt. – jones

+0

Wo haben Sie diesen Code hinzugefügt? Und haben Sie das CrossConnectivity-Paket allen Ihren Projekten hinzugefügt (PCL, Droid, iOS)? –

+0

Ja Ich habe das Paket in allen Projekten hinzugefügt. Ich habe diesen Code verwendet, um die Internetverbindung zu überwachen. Es wird ausgelöst, wenn die App verbunden ist. Dieser Teil funktioniert gut. Aber die Methode 'dba.SendUntransferedData()' wird nicht ausgeführt. – jones

Verwandte Themen