locked
После сворачивания приложения оно оказывается закрытым RRS feed

  • Вопрос

  • Добрый день!

    Создаю свое небольшое приложение. За основу взял шаблон приложения с элементом Hub (WP 8.1) и после удалил оттуда ненужные страницы. Столкнулся с такой проблемой: приложение не сохраняет свое состояние.

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

    Самое интересное то, что после попытки вернуться к моему простенькому приложению система начинает безбожно тормозить, а после чего просто зависает - вместо рабочего стола это чудо:

    Система не реагирует на нажатия кнопок телефона, даже на кнопку выключения. Единственный вариант, это выключение путем извлечения аккумулятора. Точно также ведет себя и эмулятор.

    Даже не знаю куда копать. Исключений не выбрасывается. Анализ производительности приложения не показал, что приложение потребляет ресурсы ЦП и память. Но при попытке свернуть приложение во время тестирования, система зависает, а анализатор не может завершить анализ.

    Прошу вашей помощи!

    26 августа 2014 г. 9:16

Все ответы

  • Покажите целиком код методов сохранения состояния и его восстановления.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    27 августа 2014 г. 6:26
  • Я обнаружил, что проблема заключается в сохранении модели представления. Для сохранения и восстановления используется NavigationHelper и SuspensionManager из стандартных шаблонов. Сохраняю и восстанавливаю так:

    private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e) { if (e.PageState == null) { this.defaultViewModel["ViewModel"] = new ViewModels.MainPageViewModel(); } else { this.defaultViewModel["ViewModel"] = e.PageState["MainPageViewModel"]; }

    } private void NavigationHelper_SaveState(object sender, SaveStateEventArgs e) { e.PageState["MainPageViewModel"] = this.defaultViewModel["ViewModel"]; }

    Модель представления состоит из объектов, которые состоят из примитивных типов. Причем проблема сохраняется, даже если во ViewModel оставить только пустой конструктор. Если закомментировать содержимое NavigationHelper_SaveState, то приложение без проблем сворачивается и разворачивается.

    Самое интересное, что таким способом я сохранял и восстанавливал куда более сложные ViewModel в своем другом приложении, используя те же классы.


    27 августа 2014 г. 14:56
  • В WP8.1 имеются средства, позволяющие без сторонних средств КЭШировать страницу. Достаточно его просто включить (по-умолчанию он равно Required), однако судя по Вашей проблеме, Ваш код просто не справляется, поэтому его надо переключить на Enabled. После этого попробуйте ещё раз.

    this.NavigationCacheMode = NavigationCacheMode.Enabled;


    28 августа 2014 г. 7:08
  • В WP8.1 имеются средства, позволяющие без сторонних средств КЭШировать страницу. Достаточно его просто включить (по-умолчанию он равно Required), однако судя по Вашей проблеме, Ваш код просто не справляется, поэтому его надо переключить на Enabled. После этого попробуйте ещё раз.

    this.NavigationCacheMode = NavigationCacheMode.Enabled;


    Я бы не стал баловаться с этим свойством. Оно после этого не пересоздает объект страницы, соответственно он всегда будет висеть в памяти пока ОС сама не решит, что нужно почистить. В итоге можно потерять данные.
    28 августа 2014 г. 8:00
  • Есть еще какие-нибудь предложения? Почему даже пустой класс не сохраняется?

    Решить эту проблему все-таки хотелось бы. Тестеры приложения жалуются на перезагрузку данных при возвращении на страницу.

    29 августа 2014 г. 15:24