Подтвердить что ты не робот

Сбой приложения при восстановлении с фона после долгого времени

Мое приложение аварийно завершает работу на холостом ходу в фоновом режиме. Я отлаживал и обнаружил, что причина его сбоя связана с NullPointerException. Исключение было связано с тем, что данные в классе singleton приложения уничтожаются сборщиком мусора, когда приложение находится в фоновом режиме. Я использую статические данные в каждом действии во всем приложении.

Мой вопрос: есть ли способ сделать данные класса приложения постоянными, когда в фоновом режиме? Или есть ли другое решение?

4b9b3361

Ответ 1

Для более точного ответа вы разместите свой код здесь. Вкл., Память Android ограничена, поэтому VM может удалить любую часть кода, которую он считает ненужным.

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

Еще одно важное соображение для Activity - независимо от того, что произошло с данными о сохранении, вы должны показать свой интерфейс с некоторым значением по умолчанию. Итак, предположение такое, если у меня есть данные, которые я покажу, если я этого не сделаю, мне все равно. Пользовательский интерфейс никогда не должен падать с данными или без них. Вы можете использовать String.xml для хранения некоторого значения по умолчанию или даже в макетах.

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

if (instance==null)
    instance=Singleton.getInstance()

ваш метод getInstance() не только возвращает ваш текущий экземпляр, он также удостоверится, что

  • он инициализирует весь объект и переменную
  • другие методы singleton как метод экземпляра

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

SharedPreference - это хороший способ сохранить данные, если это соответствует вашим требованиям.

если вы хотите передавать данные с разных компонентов Android, таких как Activity, Service или BroadcastReciever, вы можете поместить его внутри пакета и отправить как намерение. И, как всегда, это хранилище данных SQLLite, файл IO и т.д. И т.д.

Ответ 2

Существует несколько способов сохранения данных. Если это что-то маленькое, вы можете использовать SharedPreferences. В противном случае, возможно, база данных SQL?

Отъезд http://developer.android.com/guide/topics/data/data-storage.html

Ответ 3

Если вы можете, сохраните его другими способами. Если его сложные структуры данных, возможно, придется перезапустить приложение. Например, у меня есть пользовательский синглтон в моем приложении, в котором содержится информация для входа для моего сервера. Я не смог бы сэкономить, если бы попытался - многие данные скрыты в переменных AWS. То, что я должен был сделать, это обнаружить, когда мы были перезапущены с домашней страницы после очистки (в отличие от просто перезапуска) и запустили мою начальную деятельность, а затем закончили текущую деятельность. И я должен был добавить это к каждому действию в моем приложении.

Ответ 4

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

Ответ 5

Активность больше не видна, поэтому для нее требуется onStop() вместо onResume()