2017-05-30 6 views
1

インターネット接続を検出すると、実行するメソッドを起動するXamarin Formsアプリケーションがあります。私は使用しましたxamarinフォーム/ cで接続メソッドが呼び出されない#

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

答えて

1

ステップ1:

は一つのCを作成します。

まず、あなたはすべてのプラットフォームで

ステップ2この2つのパッケージ

Xam.Plugin.Connectivity 
plugin.wifiinfo 

を追加する必要があります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"); 
} 
+0

いいえいいえ、アプリ内のインターネット接続を監視するバックグラウンドサービスが必要です。 – jones

1

下のコードを使用します。 App.xaml.csファイルで、私はConnectivityChangedを接続するコードを追加します。そうすれば、私のアプリではこれが処理される場所が1つあり、App.xaml.csは常に私のアプリの生涯にわたって存在します。これを置くのが理想的です。

ifはCrossConnectivityからのイベントに接続し、Xamarinフォーム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パッケージを使用する:接続されている状態を格納するMessagingCenter

  • Settingsプラグインの簡易版を有する

  • +0

    私は、次の 'CrossConnectivity.Current.ConnectivityChanged + =(sender、args)=>を追加しました。 { if(args() .IsConnected) { DatabaseAccess dba = new DatabaseAccess(); dba.SendUntransferredData(); } } ' しかし、' SendUntransferredData'メソッドは実行されません。 – jones

    +0

    そのコードをどこに追加しましたか?また、すべてのプロジェクト(PCL、Droid、iOS)にCrossConnectivityパッケージを追加しましたか? –

    +0

    はいすべてのプロジェクトにパッケージを追加しました。私はインターネット接続を監視するためにこのコードを使用しました。アプリが接続されると起動します。この部分はうまく動作します。しかし、 'dba.SendUntransferredData()'メソッドは実行されません。 – jones

    関連する問題