Проблема с глобальными переменными - PullRequest
0 голосов
/ 01 августа 2011

Я определил некоторые глобальные переменные в своем приложении, расширив Application, как показано ниже.Когда я покидаю приложение, открываю другие приложения и немного играю с ними, а затем возвращаюсь в свое приложение, глобальные переменные были удалены, и мое приложение вылетало.У меня есть 2 вопроса:

1- Как это может быть возможно?

2- Как я могу заставить мое приложение выйти при переходе в фоновый режим?Я знаю, что не должен этого делать, но я не могу найти другое решение ...

Спасибо

public class GlobalVars extends Application { 

    public static HashMap<Integer, String> ID2Cat = new HashMap<Integer, String>();

    // User logged bool
    public static boolean isLogged = false;

    // Current menu item
    public static int currentMenuItem = 0;
    public static boolean isHome = false;

    // Goodideas    
    public static JSONObject goodIdeas = new JSONObject();

    // Meteo
    public static JSONArray weatherItems = new JSONArray();

    // More stuff

}

Logcat

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

I/ActivityManager( 2465): Process com.mysite.myapp (pid 23538) has died.
I/WindowManager( 2465): WIN DEATH: Window{4852a678 com.mysite.myapp/com.mysite.myapp.Home paused=false}
I/WindowManager( 2465): WIN DEATH: Window{485b63a8 com.mysite.myapp/com.mysite.myapp.Home paused=false}
I/WindowManager( 2465): WIN DEATH: Window{4826fbf8 com.mysite.myapp/com.mysite.myapp.ItemList paused=false}
I/WindowManager( 2465): WIN DEATH: Window{48286f90 com.mysite.myapp/com.mysite.myapp.ItemDetail paused=false}
W/GpsLocationProvider( 2465): Unneeded remove listener for uid 1000
D/GpsLocationProvider( 2465): stopNavigating
D/gps_BRCM( 2465): [status check] on_stop() : GPS_STATUS_SESSION_END
D/gps_BRCM( 2465): gps_engine_status_update 2
D/GpsLocationProvider( 2465): send an intent to notify that the GPS has been enabled or disabled
D/gps_BRCM( 2465): gps_stop: called
V/GpsLocationProvider( 2465): hybridGpsSensorDeregister : No registered sensorManager
D/GpsLocationProvider( 2465): hybridGpsSensorDeregister

Ответы [ 6 ]

1 голос
/ 07 февраля 2012

Это просто, вы должны инициализировать свои объявленные переменные в Application.OnCreate, я только что протестировал, и он работает, когда сбой приложения вызывает снова Application.OnCreate.

1 голос
/ 01 августа 2011

Вы должны использовать соответствующие обработчики событий жизненного цикла для сохранения данных и их восстановления после повторной активации: onSaveInstanceState (), onPause () и onResume ().Вы не можете с уверенностью предположить, что ваши глобальные поля останутся нетронутыми.

Я бы предложил познакомиться с жизненным циклом Activity .

1 голос
/ 01 августа 2011

1- Как это возможно?

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

2 - Как заставить свой приложение завершать работу при переходе в фоновый режим?

Вы этого не делаете.

Я знаю, что не должен этого делать

Мало того, но это не поможет вам в этом случае.Все, что он сделает, это означает, что вы зависаете в 100% случаев, поскольку на самом деле вы не удосужились правильно инициализировать.

, но я не могу найти другое решение.

Инициализируйте ваши данные.Если ваше приложение дает сбой из-за того, что был создан новый пользовательский экземпляр Application, в вашем подклассе Application есть ошибки, которые вам нужно исправить.

0 голосов
/ 29 мая 2015

Я столкнулся с подобной проблемой, и в основном эта статья хорошо объясняет http://www.developerphil.com/dont-store-data-in-the-application-object/

Это ключевой параграф и то, что с вами происходит:

Что подводит нас к сути проблемы: объект приложения не останется в памяти навсегда, он будет уничтожен. Вопреки распространенному мнению, приложение не будет перезапущено с нуля. Android создаст новый объект Application и запустит действие, в котором он находился раньше, чтобы создать иллюзию, что приложение никогда не было убито.

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

0 голосов
/ 01 августа 2011

Класс Application предназначен для инициализации глобальных переменных - так что вы правильно сделали эту часть. Однако вам придется объявить эти переменные в другом классе, поскольку Application вызывается только при повторном запуске приложения, а не в фоновом режиме.

Вы также должны выполнить эти инициализации в методе Application onCreate() (используя аннотацию @Override).

0 голосов
/ 01 августа 2011

@Override onPause в вашей деятельности, а затем используйте finish ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...