2013-04-18 145 views
0

我正在創建我的第一個Windows應用商店應用程序,並且在啓動期間我還有幾個Web服務調用,並且還定期通過該應用程序。但是我注意到,當我因爲網絡服務調用而無法訪問互聯網時,我的應用程序將開始/崩潰或關閉。我希望我的應用程序能夠以正常的方式啓動一些初始數據,即使在沒有互聯網訪問的情況下也是正常的。我從webservice獲得的數據主要是我在各種文本框和圖表中顯示的天氣數據。當沒有互聯網時,Windows商店應用程序崩潰

下面的代碼顯示了我的擴展閃屏中的web服務調用。

public sealed partial class ExtendedSplashScreen : Page 
{ 

//parameterItem max1DayAgo = new parameterItem(); 
//parameterItem min1DayAgo = new parameterItem(); 


public ExtendedSplashScreen() 
{ 
    this.InitializeComponent(); 
} 

/// <summary> 
/// Invoked when this page is about to be displayed in a Frame. 
/// </summary> 
/// <param name="e">Event data that describes how this page was reached. The Parameter 
/// property is typically used to configure the page.</param> 
protected override async void OnNavigatedTo(NavigationEventArgs e) 
{ 

    string[] periodSelector = { "1DayAgo", "1WeekAgo", "1MonthAgo" }; 
    string[] modeSelector = { "max", "min" }; 
    string[] parameterSelector = { "umtTemp1", "umtWindSpeed", "umtAdjBaromPress", "umtRainRate" }; 


    //Create a webservice object 
    ServiceReference.WebServiceSoapClient webServiceObj = new ServiceReference.WebServiceSoapClient(); 
    //First we create an object that holds max data for yesterday 
    var getMax1DayAgoObj = await webServiceObj.GetSelectedMaxMinDataAsync(parameterSelector, periodSelector[0], modeSelector[0]); 

    //create an object that holds min data for yesterday 

    var getMin1DayAgoObj = await webServiceObj.GetSelectedMaxMinDataAsync(parameterSelector, periodSelector[0], modeSelector[1]); 
    //Save arrayOfValue and arrayOfUnit to a parameterItem object. these objects are created during startup 
    // and the can be accessed and updated by all methods in this page later we will see that maxMinButton_Click method 
    //for the maxMinButton will use these data 

    //create an object that holds max data for last week 
    var getMax1WekAgoObj = await webServiceObj.GetSelectedMaxMinDataAsync(parameterSelector, periodSelector[1], modeSelector[0]); 
    //create an object that holds min data for last week 
    var getMin1WekAgoObj = await webServiceObj.GetSelectedMaxMinDataAsync(parameterSelector, periodSelector[1], modeSelector[1]); 
    //create an object that holds max data for last month 
    var getMax1MonthAgoObj = await webServiceObj.GetSelectedMaxMinDataAsync(parameterSelector, periodSelector[2], modeSelector[0]); 
    //create an object that holds min data for last month 
    var getMin1MonthAgoObj = await webServiceObj.GetSelectedMaxMinDataAsync(parameterSelector, periodSelector[2], modeSelector[1]); 


    (App.Current as App).max1DayAgo.arrayOfValue = getMax1DayAgoObj.arrayOfValue; 
    (App.Current as App).max1DayAgo.arrayOfUnit = getMax1DayAgoObj.arrayOfUnit; 

    (App.Current as App).min1DayAgo.arrayOfValue = getMin1DayAgoObj.arrayOfValue; 
    (App.Current as App).min1DayAgo.arrayOfUnit = getMin1DayAgoObj.arrayOfUnit; 


    (App.Current as App).max1WeekAgo.arrayOfValue = getMax1WekAgoObj.arrayOfValue; 
    (App.Current as App).max1WeekAgo.arrayOfUnit = getMax1WekAgoObj.arrayOfUnit; 

    (App.Current as App).min1WeekAgo.arrayOfValue = getMin1WekAgoObj.arrayOfValue; 
    (App.Current as App).min1WeekAgo.arrayOfUnit = getMin1WekAgoObj.arrayOfUnit; 

    (App.Current as App).max1MonthAgo.arrayOfValue = getMax1MonthAgoObj.arrayOfValue; 
    (App.Current as App).max1MonthAgo.arrayOfUnit = getMax1MonthAgoObj.arrayOfUnit; 

    (App.Current as App).min1MonthAgo.arrayOfValue = getMin1MonthAgoObj.arrayOfValue; 
    (App.Current as App).min1MonthAgo.arrayOfUnit = getMin1MonthAgoObj.arrayOfUnit; 


    string[] startupData = new string[13]; 


    startupData[0] = " " + (App.Current as App).max1DayAgo.arrayOfValue[0] + " " + (App.Current as App).max1DayAgo.arrayOfUnit[0]; // maxTemp 
    startupData[1] = " " + (App.Current as App).max1DayAgo.arrayOfValue[1] + " " + (App.Current as App).max1DayAgo.arrayOfUnit[1]; // maxWindSped 
    startupData[2] = " " + (App.Current as App).max1DayAgo.arrayOfValue[2] + " " + (App.Current as App).max1DayAgo.arrayOfUnit[2]; // maxAirPressure 
    startupData[3] = " " + (App.Current as App).max1DayAgo.arrayOfValue[3] + " " + (App.Current as App).max1DayAgo.arrayOfUnit[3];//  maxRainfall 

    startupData[4] = " " + (App.Current as App).min1DayAgo.arrayOfValue[0] + " " + (App.Current as App).min1DayAgo.arrayOfUnit[0]; // minTemp 
    startupData[5] = " " + (App.Current as App).min1DayAgo.arrayOfValue[1] + " " + (App.Current as App).min1DayAgo.arrayOfUnit[1];//  minWindSped 
    startupData[6] = " " + (App.Current as App).min1DayAgo.arrayOfValue[2] + " " + (App.Current as App).min1DayAgo.arrayOfUnit[2];//  minAirPressure 
    startupData[7] = " " + (App.Current as App).min1DayAgo.arrayOfValue[3] + " " + (App.Current as App).min1DayAgo.arrayOfUnit[3];//  minRainfall 



    // Main fields 
    // ServiceReference.WebServiceSoapClient webServiceObj = new ServiceReference.WebServiceSoapClient(); 
    var getLatestTempObj = await webServiceObj.GetLatestDataAsync("umtTemp1"); 
    var getLatestWindObj = await webServiceObj.GetLatestDataAsync("umtWindSpeed"); 
    var getLatestwindDirObj = await webServiceObj.GetLatestDataAsync("umtAdjWinDir"); 
    var getLatestairPressureObj = await webServiceObj.GetLatestDataAsync("umtAdjBaromPress"); 

    startupData[8] = " " + getLatestTempObj.Value + " " + getLatestTempObj.Unit;//temperatureMainTxtBlock.Text 
    startupData[9] = " " + getLatestWindObj.Value + " " + getLatestWindObj.Unit;//temperatureMainTxtBlock.Text 

    startupData[10] = "" + getLatestwindDirObj.Value; //temperatureMainTxtBlock.Text 

    startupData[11] = " " + getLatestairPressureObj.Value + " " + getLatestairPressureObj.Unit;//temperatureMainTxtBlock.Text 

    startupData[12] = "Last update: " + getLatestwindDirObj.Timestamp;//temperatureMainTxtBlock.Text 
    //save the startup data to the global variables 
    (App.Current as App).NavigateData = startupData; 



    this.Frame.SetNavigationState(e.Parameter as string); 
    this.Frame.Navigate(typeof(MainPage)); 
} 
} 
+1

你有沒有嘗試過把'try {} catch {}'塊中崩潰的代碼?您也可以先檢查是否有連接,但Windows中似乎有一個連接可用的錯誤,但操作系統認爲它不是。 – Nolonar

回答

0

我們在某些基於團隊的應用程序中使用的方法在任何調用返回網絡數據之前都會檢查網絡狀態。例如:

 

async Task RefreshFromWeb(...) 
{ 
    if (!App.HasInternetAccess) 
    { 
     await new Windows.UI.Popups.MessageDialog(Strings.NoInternetWarning).ShowAsync(); 
     return; 
    } 

    //attempt access here 
} 

public static bool HasInternetAccess 
{ 
    get 
    { 
     var profile = Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile(); 
     if (profile == null) 
      return false; 
     return profile.GetNetworkConnectivityLevel() == 
       Windows.Networking.Connectivity.NetworkConnectivityLevel.InternetAccess; 
    } 
} 
 

我們還採取了另一種方法,有時這是非常相似,但用途等待並返回true或false(同樣很容易被上面完成,上述這種做法只是給對話框)

 
public static async System.Threading.Tasks.Task HasInternet() 
{ 
    var profile = Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile(); 
    var hasNetAccess = profile != null; 
    if (!hasNetAccess) 
     await new Windows.UI.Popups.MessageDialog(
      content: InfoHub.AppHubViewModel.Strings.NoInternetWarning, 
      title: InfoHub.AppHubViewModel.Strings.NoInternetWarning).ShowAsync(); 
    return hasNetAccess; 
} 

async void YourControlEvent_Click(object sender, ItemClickEventArgs e) 
{ 
    //if net access, do your stuff, otherwise ignore for now 
    if (await IsInternet()) 
    { 
     //do net calls here 
    } 
} 
0

你需要實現一些例外,圍繞這條線處理: ServiceReference.WebServiceSoapClient webServiceObj = new ServiceReference.WebServiceSoapClient();

和實施一個備用,將工作在離線模式,即從緩存中檢索數據。

0

您可以在App.xaml.cs中使用NetworkStatusChanged事件,然後您可以聲明一個靜態變量並使用它來檢查Internet是否可用。如果互聯網可用,請執行您所需的操作,否則顯示錯誤消息

public static bool IsInternetAvailable; 

void NetworkInformation_NetworkStatusChanged(object sender) 
{ 
    if (NetworkInformation.GetInternetConnectionProfile() != null) 
     App.IsInternetAvailable = true; 
    else 
     App.IsInternetAvailable = false; 
} 

始終使用trycatch塊,當你有異常的概率。

相關問題