2017-06-12 30 views
1

我有一個應用程序開發Xamarin(跨平臺),現在運行良好!但總是需要互聯網連接。 如果互聯網連接失敗,我的應用程序遭受意外關機。我想控制這一點。 首先我有 「AzureDataService」 類:驗證互聯網連接或Azure服務 - Xamarin

public class AzureDataService 
{ 
    //Conexion to backend 
    public MobileServiceClient MobileService { get; set; } 

    //Object of "Ficha" class. 
    IMobileServiceSyncTable<Ficha> tablaFicha; 

    public async Task Initialize() 
    { 
     if (isInitialized) 
      return; 
     MobileService = new MobileServiceClient("http://linkbdd"); 

     //Save data in a local DB, later upload with internet connection 
     const string path = "bbddMuestra.db"; 

     var store = new MobileServiceSQLiteStore(path);//Create DB 

     store.DefineTable<Ficha>(); 

     //async initialization 
     await MobileService.SyncContext.InitializeAsync(store, new MobileServiceSyncHandler()); 

     //Inicializate table 
     tablaFicha = MobileService.GetSyncTable<Ficha>(); 

     isInitialized = true; 
    } 

    //Here get data 
    public async Task<IEnumerable<Ficha>> GetData() 
    { 
     await Initialize(); 
     await SyncFicha(); 
     //Select data... 
     return await tablaFicha.OrderBy(a => a.Id).ToEnumerableAsync(); 
    } 

    public async Task SyncFicha() 
    { 
     await tablaVehiculos.PullAsync("Ficha", tablaFicha.CreateQuery()); 
     await MobileService.SyncContext.PushAsync(); 
    } 

「AzureDataService」 類的結束。現在該類實現AzureDataService。

public partial class ListaFichas : ContentPage 
{ 
    public static ObservableCollection ficha; 

    public ListaFichas() 
    { 
     InitializeComponent(); 
     ficha = new ObservableCollection(); 
    } 

    protected async override void OnAppearing() 
    { 
     base.OnAppearing(); 
     ficha.Clear();  

     //Next line get data from previous method of class "AzureDataService" 
     var ligas = await App.AzureService.GetData(); 
     foreach(var item in ligas) 
     { 
      Ficha fi = item; 
      ficha.Add(fi); 
     } 
     //Here bind listview with data that previous get 
     lsvFichas.ItemsSource = ficha; 
    } 

請幫幫我。我想要顯示一個Display或DisplayActionSheet來通知用戶...但是永遠不會意外關機。 謝謝!...

+0

UWP社區工具包有一個HelperClass調用了'NetworkHelper',它有一個方法'NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable',如果'yes'你有互聯網連接。您可以使用此功能並按照特定要求進行處理。 – AVK

+1

James提供了一個跨平臺的插件連接。除了你總是可以使用try/catch來獲取超時異常,如果你無法連接。無論如何,你應該這樣做,因爲任何連接標誌都可能是錯誤的。我經歷過很多次,當它沒有連接時,連接是正確的,反之亦然 –

回答

0

AFAIK有用的,如果你打電話給PushAsync PUSH 同步的內容,然後創建,更新和刪除列表將針對您的離線表格逐個發送到Azure應用服務。 PullAsyncPushAsync操作都需要您的移動客戶端在線。

根據我的理解,您可以在致電SyncFicha之前檢查互聯網連接,以便同步您的數據。此外,您可以將SyncFicha方法與try-catch包裝在一起處理互聯網連接,並在您推送離線數據時發生衝突。我建議你可以參考由阿德里安·霍爾的書下面的教程如下:

  • Detecting Connection State

    使用Xam.Plugin.Connectivity檢查連接狀態如下:

    await Initialize(); 
    
    if (!(await CrossConnectivity.Current.IsRemoteReachable(Client.MobileAppUri.Host, 443))) 
    { 
        Debug.WriteLine($"Cannot connect to {Client.MobileAppUri} right now - offline"); 
        return; 
    } 
    
    await tablaVehiculos.PullAsync("Ficha", tablaFicha.CreateQuery()); 
    await MobileService.SyncContext.PushAsync(); 
    
  • Handling Conflict Resolution