0

多くの Web サービス呼び出しを含むアプリを作成しています。フローを改善し、おそらく起動時間に関する Windows ストアの要件を満たすために、拡張スプラッシュ スクリーンを使用してすべてのメイン データをロードし、このデータをさまざまなデバイス間で共有することにしました。 App.xaml.cs で定義したグローバル変数を使用するページ。

私の質問は: このようにグローバル変数を使用することは正しいですか? アプリが一時停止/再開されたときにこのデータが失われるリスクはありますか?

以下は私のコードです

app.xaml.cs ページのコードを次に示します。ここでは、グローバル変数を定義し、拡張スプラッシュ スクリーンに移動する前に、Web サービスからアプリの背景画像を読み込みます。

   sealed partial class App : Application
        {

            **public string[] NavigateData { get; set; }
            public NavigationCacheMode NavigationCacheMode { get; set; }**



            public App()
            {
                this.InitializeComponent();
                this.Suspending += OnSuspending;

                //Cache the page     
                this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
            }


            protected async override void OnLaunched(LaunchActivatedEventArgs args)
            {
                Frame rootFrame = Window.Current.Content as Frame;
               //---------------------------------Live tile
                var uris = new List<Uri> 
                { 
                    new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetFirstTile"),

                    new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetSecondTile"),
                    new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetStatisticTile"),
                    new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetNewsTile1"),
                    new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetNewsTile2"),

                };

                TileUpdater LiveTileUpdater = TileUpdateManager.CreateTileUpdaterForApplication();         
                LiveTileUpdater.EnableNotificationQueue(true);  // Enable notifications
                LiveTileUpdater.Clear();  // Clear the current set of updates
                LiveTileUpdater.StartPeriodicUpdateBatch(uris, PeriodicUpdateRecurrence.HalfHour);
                //------------------------------Live tile section end


                // Do not repeat app initialization when the Window already has content,
                // just ensure that the window is active
                if (rootFrame == null)
                {
                    // Create a Frame to act as the navigation context and navigate to the first page
                    rootFrame = new Frame();
                    weather.Common.SuspensionManager.RegisterFrame(rootFrame, "appFrame");


       //When the app is loaded first time it calls the web service to get wich background picture to use
             //--------------------------Getting and setting background image for all the pages--------------------
                    string appBackgGround;
       ServiceReference.WebServiceSoapClient webServiceObj = new ServiceReference.WebServiceSoapClient();
                    // Get the name of the Background picture
       appBackgGround = await webServiceObj.GetBackgroundImageAsync();


                    // Her we set the application background Image for all pages  "backgroundImageBlueSky.jpg"
                    rootFrame.Background = new ImageBrush
                    {
                        Stretch = Windows.UI.Xaml.Media.Stretch.UniformToFill,
                        ImageSource = new BitmapImage { UriSource = new Uri("ms-appx:///Assets/"+appBackgGround) }

                    };
      //--------------------------Bacground image end--------------------



                    if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
                    {
                        //TODO: Load state from previously suspended application
                        await weather.Common.SuspensionManager.RestoreAsync();
                    }

                    // Place the frame in the current Window
                    Window.Current.Content = rootFrame;
                }

                if (rootFrame.Content == null)
                {
                    // When the navigation stack isn't restored navigate to the first page,
                    // configuring the new page by passing required information as a navigation
                    // parameter
                    //Go to the extended splash screen
                    if (!rootFrame.Navigate(typeof(ExtendedSplashScreen), rootFrame.GetNavigationState()))
                    {
                        throw new Exception("Failed to create initial page");
                    }


                }
                // Ensure the current window is active
                //create the about page
                var _Helper = new Flyouts.SettingsHelper();
                _Helper.AddCommand<Flyouts.About>("About");
                Window.Current.Activate();
            }


            private async void OnSuspending(object sender, SuspendingEventArgs e)
            {
                var deferral = e.SuspendingOperation.GetDeferral();
                //TODO: Save application state and stop any background activity
                await weather.Common.SuspensionManager.SaveAsync();
                deferral.Complete();
            }


        }
    }   

ExtendedSplashScreen:ここでは、メインページに移動する前に、Web サービスからアプリの初期化データを読み込みます。データは、App.xaml.cs で定義されたグローバル変数に保存されます。このデータのロード中は、進行状況リングが表示されます。データが読み込まれた後、メインページに移動します

public sealed partial class ExtendedSplashScreen : Page
{

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


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

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {

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

        //---------------GETTING WEBSERVICE DATA FOR STARTUP-------------
        //Create a webservice object
        ServiceReference.WebServiceSoapClient webServiceObj = new ServiceReference.WebServiceSoapClient();       
        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
        max1DayAgo.arrayOfValue = getMax1DayAgoObj.arrayOfValue;
        max1DayAgo.arrayOfUnit = getMax1DayAgoObj.arrayOfUnit;

        min1DayAgo.arrayOfValue = getMin1DayAgoObj.arrayOfValue;
        min1DayAgo.arrayOfUnit = getMin1DayAgoObj.arrayOfUnit;

        string[] startupData = new string[13];

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

        startupData[4] = " " + min1DayAgo.arrayOfValue[0] + " " + min1DayAgo.arrayOfUnit[0]; //    minTemp 
        startupData[5] = " " + min1DayAgo.arrayOfValue[1] + " " + min1DayAgo.arrayOfUnit[1];//     minWindSped 
        startupData[6] = " " + min1DayAgo.arrayOfValue[2] + " " + min1DayAgo.arrayOfUnit[2];//     minAirPressure  
        startupData[7] = " " + min1DayAgo.arrayOfValue[3] + " " + min1DayAgo.arrayOfUnit[3];//     minRainfall
        // Main fields

        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
        **//pass the webservice data to the global variable
        (App.Current as App).NavigateData = startupData;**

        //since im using extendes splash screen i reset the navigation history so the user cannot go back to the extended splash screen      
        this.Frame.SetNavigationState(e.Parameter as string);
        //Go to mainpage
        this.Frame.Navigate(typeof(MainPage));
    }
}

MainPage: Mainpageでは、拡張スプラッシュ スクリーンによってロードされたグローバル データをテキスト ボックスに表示します。

public sealed partial class MainPage : weather.Common.LayoutAwarePage
    {
        //Defining objects use through this page
        maxMinSelector maxMinButtonSelector = new maxMinSelector();

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

        parameterItem max1WeekAgo = new parameterItem();
        parameterItem min1WeekAgo = new parameterItem();

        parameterItem max1MonthAgo = new parameterItem();
        parameterItem min1MonthAgo = new parameterItem();

        EasingDoubleKeyFrame keyFrame = new EasingDoubleKeyFrame();

        public MainPage()
        {
            this.InitializeComponent();
            Loaded += MainPage_Loaded;


             Code
         ------------------
         ------------------
         ------------------
         ------------------
            //Cache the page     
            this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
        }


        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
             Code
            ------------------
         ------------------
         ------------------
         ------------------
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {

            // HERE i use the global data initialised in the extended splash screen
            base.OnNavigatedTo(e);
            maxTempTextblock.Text = (App.Current as App).NavigateData[0];
            maxWindSpedTextBlock.Text = (App.Current as App).NavigateData[1];
            maxAirPressureTextBlock.Text = (App.Current as App).NavigateData[2];
            maxRainfallTextBlock.Text = (App.Current as App).NavigateData[3];

            minTempTextblock.Text = (App.Current as App).NavigateData[4];
            minWindSpedTextBlock.Text = (App.Current as App).NavigateData[5];
            minAirPressureTextBlock.Text = (App.Current as App).NavigateData[6];
            minRainfallTextBlock.Text = (App.Current as App).NavigateData[7];


            temperatureMainTxtBlock.Text = (App.Current as App).NavigateData[8];
            WindSpeedTxtBlockLower.Text = (App.Current as App).NavigateData[9];
            WindDirectionTxtBlockLower.Text = (App.Current as App).NavigateData[10];
            airPressureTxtBlockLower.Text = (App.Current as App).NavigateData[11];
            LastUpdateTextField.Text = (App.Current as App).NavigateData[12];


        }

        Code
          ------------------
         ------------------
         ------------------
          ------------------
         ------------------
         ------------------
         ------------------

          ------------------
         ------------------
         ------------------
         ------------------

         ------------------



    }
4

1 に答える 1

1

これは実際にはあなたの正確な質問に対する答えではありませんが、ビルド 2012 からのスタートアップの応答性と XAML のパフォーマンスに関する素晴らしいビデオがあり、あなたが求めていることに少し触れているかもしれません。彼は、起動時の雑用が多いアプリの処理方法について少し話しています。

http://channel9.msdn.com/Events/Build/2012/4-103

于 2013-04-17T03:53:42.777 に答える