2013-04-18 146 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块,当你有异常的概率。

相关问题