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

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

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

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

Solutions Collecting From Web of "Статическая переменная null при возврате в приложение"

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

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

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

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

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

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

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

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

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

Обоснование:

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

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

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

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

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

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

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