статическая переменная нуль при возврате в приложение - PullRequest
53 голосов
/ 03 марта 2012

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

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

Есть ли флажок, чтобы установить это поведение?

Ответы [ 8 ]

41 голосов
/ 03 марта 2012

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

Вы должны сохранить свои данные в более надежном месте. Эта статья о Хранилище данных может оказаться полезной. Этот вопрос также должен быть актуальным: Сохранение состояния активности Android с помощью Save Instance State

Обратите внимание, что это на самом деле , а не проблема устройства с одним из шести. Это является «проблемой» на всех устройствах, это просто более очевидно на одном из ваших устройств, вероятно, потому что у него меньше памяти. Если вы запускаете приложение с большим объемом памяти на любом другом устройстве, вы должны увидеть такое же поведение. Также нет флага, чтобы предотвратить это. Это стандартно и ожидаемо.

20 голосов
/ 08 декабря 2014

Обычно это происходит, когда устройство переходит в спящий режим .

Такое поведение устройства можно эмулировать с помощью следующих шагов:

  1. Запуститеприложение и нажмите кнопку «Домой»
  2. В Android Studio в левом нижнем углу выберите отлаженное приложение и нажмите кнопку X (завершить приложение) слева от названия приложения.(Не знаю, как Eclipse, но я думаю, аналогично)
  3. Нажмите на значок приложения на устройстве .

Если Задача была активна,приложение откроется при последней активности и (скорее всего) выдаст ошибку, потому что все статические переменные были выведены .

5 голосов
/ 01 мая 2013

Решение об использовании static (singleton's) в Android очень простое:

Реализуйте класс, расширяющий android.app.Application, и выполните всю вашу инициализацию синглтона в пределах onCreate()

Причина:

  • класс, расширяющий Application, выполняется первым, даже когда процесс вашего приложения завершается из-за нехватки памяти
  • ваше приложение имеет контекст, как только вызывается Application.onCreate ()
5 голосов
/ 03 марта 2012

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

1 голос
/ 20 августа 2014

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

например:

        /* save my satatic hashmap in case of activity stopped to retrieve it again in  onRestoreInstanceState method*/
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);

    //Common.PERMISION_MAP static hashmap 
            if (Common.PERMISION_MAP != null) {
                Iterator<Permission> iterator = Common.PERMISION_MAP.values()
                        .iterator();
                ArrayList<Permission> permissionList = new ArrayList<Permission>();
                while (iterator.hasNext()) {
                    Permission permission = (Permission) iterator.next();
                    permissionList.add(permission);

                }
                outState.putParcelableArrayList("PERMISSION_LIST", permissionList);
            }


        }

        /* restore my satatic hashmap when activity stopped */
        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);

            try {
                ArrayList<Permission> permissionList = savedInstanceState
                        .getParcelableArrayList("PERMISSION_LIST");

                if (Common.PERMISION_MAP == null)
                    Common.PERMISION_MAP = new HashMap<Permission, Permission>();
for (Permission permission : permissionList) {
                Common.PERMISION_MAP.put(permission, permission);

            }   
                } catch (Exception ex) {
                String string = ex != null ? ex.getMessage() : "";
                Log.e(TAG, (string != null ? string : ""));
                ex.printStackTrace();

            }
        }
0 голосов
/ 22 декабря 2018

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

  1. Сначала инициализируйте статическую переменную в Sharedpreferece или в saveInstanceState следующим образом

    sharedpreference.purString("your_static_variable_name","your_static_variable_value").
    

    или

    savedInstanceState.putString("your_static_variable_name","your_static_variable_value").
    

в первом исполнении oncreate() метод деятельности или в другом месте

Во-вторых, переинициализируйте ваши статические переменные в onResume() методах через sharedpreference или saveInstance, в зависимости от того, что использовалось ранее.
0 голосов
/ 15 января 2014

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

0 голосов
/ 03 марта 2012

Возможно, вы просто хотите перейти по второй ссылке от kabuko. Но если вы хотите сохранить статическую переменную (возможно, у вас есть для этого веская причина), вы можете сделать это:

private static MyObjType getVariable()
{
   if (myVar == null)
     myVar = new MyObjType();  // do whatever else you need to here

   return myVar;
}

Таким образом, вы можете заменить ваши вызовы myVar.test () на getVariable (). Test (), и вы знаете, что это никогда не вызовет исключение нулевого указателя.

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