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

Статическая переменная null при возврате в приложение

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

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

Есть ли флаг для предотвращения этого поведения?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Рассуждение:

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

Ответ 4

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

Ответ 5

Вы должны сохранить свои значения в 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();

            }
        }

Ответ 6

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

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

   return myVar;
}

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

Ответ 7

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

Ответ 8

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

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

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

    или же

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

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

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