2013-10-09 4 views
5

Привет, Мы сталкиваемся с непонятной проблемой в нашем приложении для Android. В нашем приложении мы сохраняем все необходимые объекты/данные в объекте Common (называемом объектом A) при запуске приложения (первая активность). Мы сохранили сам контекст в этом объекте. Всякий раз, когда нам нужен контекст в нашем приложении, мы получаем контекст из объекта A и используем его. Все случаи его работы прекращаются, за исключением случаев, когда дело касается.

i) Пока наше приложение находится в фоновом режиме, мы играли в некоторые игры высокого уровня. Теперь мы вернулись в приложение с помощью минимизированного экрана (последние приложения). Внезапно приложение разбилось.
ii) Если мы заставили остановить приложение с помощью настроек и вернулись в приложение с помощью минимизированного экрана, произойдет один и тот же сбой.
Объект становится пустым

Оба случая, объект A становится нулевым (он может быть удален GC), поэтому все операции, зависящие от объекта A, получают исключения.

Почему это происходит? Как мы мешаем GC собирать объект A? Как мы можем справиться с остановкой силы? Пожалуйста, дайте любые идеи.

+0

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

+0

Это, вероятно, самая важная концепция, которую вы должны понимать при написании приложений для Android. http://developer.android.com/training/basics/activity-lifecycle/index.html – Kuffs

+0

Android (на самом деле, Dalvik) НЕ объединяет отдельные объекты, если ваше приложение не работает, и ссылки на него отсутствуют. Я понятия не имею, где этот миф начался. Ваше ** приложение ** может быть убито, и в этом случае все начинается с нуля. Если вам нужно сохранить состояние, сериализуйте его с помощью 'onPause()' и/или 'onStop()'. Примечание. 'OnDestroy()' полезно, только если вы закончили() 'действие. Кстати, если этот «контекст», который вы храните, является контекстом «Активность», вы делаете все это неправильно. – Simon

ответ

7

Почему это происходит?

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

Как предотвратить сбор GC с объекта A?

Не делайте этого. Найдите другое решение проблемы.

Как мы можем справиться с остановкой силы? Пожалуйста, дайте любые идеи.

В конце концов, решение зависит от вас, но вот несколько общих опций:

  • Когда сохраненные данные больше не существует, то рассматривать это как свежий запуск приложения. Принесите пользователя на целевую страницу и попросите его начать новую игру.
  • Сохранять данные. В зависимости от того, что вы храните, SharedPreferences или SQLite могут быть хорошими вариантами. См. Storage Options для краткого изложения ваших вариантов хранения.

Второй вариант, очевидно, не будет работать для вашего Контекста, но я бы, вероятно, создал другое решение для Контекста.

2

Для этого лучше использовать контекст приложения! Просто используйте getApplicationContext() в своем Activity и используйте вместо этого. В противном случае ваша активность будет протекать, как только система нуждается в памяти.

Ваша деятельность попадает в фоновом режиме при нажатии на дом, , когда вы играете в видеоиграх или приложениях, потребляющих память, ваша деятельность освобождается системой.

Постарайтесь понять активность Lifecycle, чтобы решить эту проблему:

enter image description here

Кроме того, видя его в «нормальной» Java ваш обернутый объект для деятельности получает собранной GC как только его eligable для него , т.е. на него больше не ссылаются никакие другие объекты. Этого нельзя предотвратить, если ваше приложение освободится, когда система нуждается в памяти. Попробуйте проверить значение null в onResume() и снова заново создать объект!

Надеюсь, это может вам помочь.

Смежные вопросы