Правильно ли работать с клавишами Tombstoning и Back для повышения производительности? - PullRequest
5 голосов
/ 05 апреля 2011

Есть ли лучшая практика для правильной обработки надгробий и клавиш возврата?

Как указано в документе MSDN, вы должны сохранять временные данные в методе OnNavigatedFrom. Итак, код для сохранения состояний при захоронении ясен.

Но теперь, если вы нажмете клавишу возврата, также будет вызван метод OnNavigatedFrom, и если вы не добавите дополнительные проверки, вы сначала сохраните состояния в словаре, а вскоре после этого страница будет уничтожена. И так будет словарь PhoneApplicationPage.State. Таким образом, код сохранения - это полностью потраченное впустую время процессора, диска и аккумулятора .

Вот что я сделал, чтобы предотвратить это:

    protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
    {
        // when navigating back
        if (e.NavigationMode == System.Windows.Navigation.NavigationMode.Back)
        {
            backKeyPressed = true;
        }
    }

    protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
    {
        if (backKeyPressed)
        {
            // Don't save states on back key!
            backKeyPressed = false;     // set it anyway
            return;
        }

        // Tombstoning
        // save objects
        this.SaveState("text", someText);
        ...
    }

В качестве напоминания: OnNavigatingFrom будет вызываться только при переходе назад / назад со страницы, но не при захоронении приложения.

Примечание: указанный код охватывает только страницы, на которые можно перейти только назад. Вот почему я добавил backKeypressed к OnNavigatingFrom. Вам нужны дополнительные проверки, если страница может перейти на другую страницу.

  1. Есть ли лучший способ сделать это для каждой создаваемой страницы?
  2. Теперь мне действительно нужно добавить переменную backKeyPressed и проверять каждую страницу, которую я создаю?
  3. Разве фреймворк не должен предоставить нам что-то для разработчика, чтобы нам не пришлось об этом беспокоиться?

Что вы думаете об этом?

EDIT:

Обновлен вопрос, чтобы сделать его понятнее.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Ваш подход проверки направления навигации в OnNavigatingFrom действительно является рекомендуемой практикой, чтобы избежать ненужного снижения производительности при сохранении состояния непосредственно перед удалением страницы из обратного стека.

Есть одно пояснение, которое я хочу добавить к вашему примеру кода: вы должны проверить свойство 'NavigationMode' в 'NavigationCancelEventArgs', чтобы определить, является ли это навигацией вперед или назад.

Тогда сохраняйте состояние в OnNavigatedFrom, только если это была навигация вперед, как показывает ваш пример. Это поможет улучшить вашу производительность при переходе пользователя назад.

1 голос
/ 05 апреля 2011

Все, что вам когда-либо нужно было знать о надгробии, освещено в серии статей из блога Джеффа Прайза, состоящей из 4 частей, Реальное захоронение в Silverlight для Windows Phone 7 . Возможно, вы захотите обратить особое внимание на часть 2, в которой Джефф говорит об очистке состояния при выходе из приложения.

...