Фрагмент воссоздан после уничтожения активности из-за нехватки памяти

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

Теперь, после создания Fragment, я возвращаюсь на главный экран, открываю другое приложение и так далее и создаю ситуацию с нехваткой памяти. Мой Activity убит из-за нехватки памяти.

Теперь я открываю диспетчер задач и снова нажимаю на свое приложение.

Android пытается вернуть все обратно на экран. Поскольку все Activity уничтожены, данные также теряются, но он все еще пытается воссоздать фрагмент, хотя данных нет, и мое приложение вылетает.

Что я могу сделать?... У меня есть два решения (ну, по крайней мере, теоретические решения)

  1. предотвратить перезапуск активности при возобновлении работы (как я могу это сделать????)

  2. предотвратить создание представления фрагмента для использования данных, если оно не существует

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


person laymelek    schedule 19.02.2014    source источник


Ответы (3)


И годы спустя... Имея ту же проблему, жестокое решение - установить для saveInstanceSate значение null перед вызовом super :

@Override
protected void onCreate(Bundle savedInstanceState) {
    savedInstanceState = null;
    super.onCreate(savedInstanceState);
}
person Nebneb    schedule 14.09.2016

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

Что касается фрагмента, создайте его или вызовите в onPostExecute вашей асинхронной задачи, чтобы обеспечить загрузку данных. (если вы вызываете is else where по запросу (например, при нажатии кнопки), то обусловите его вызов логической переменной и установите для этой переменной значение false в onResume и установите для нее значение true в onPostExecute вашей асинхронной задачи)

еще одна вещь: вы можете захотеть отобразить диалоговое окно прогресса с (cancelable = false) в вашей асинхронной задаче, чтобы обеспечить целостность данных и запретить пользователю перемещаться по вашему пейджеру, если данные не будут полностью загружены, - Показать диалоговое окно прогресса в onPreExecute и (дисс пропустить) это в onPostExecute

-- Надеюсь, это поможет :)

person Osama_Almaani    schedule 19.02.2014
comment
Ну, я уже создаю свой фрагмент в файле onPostExecute. Но когда активность прекращается из-за нехватки памяти, а приложение выводится на передний план по запросу, Android пытается воссоздать фрагмент сам по себе без какого-либо вызова... вот когда происходит сбой приложения. - person laymelek; 20.02.2014
comment
Извините, я сейчас ничего не могу придумать, но быстрый обходной путь - заключить ваш код создания фрагмента в try catch, и для вас catch будет вызван, когда произойдет ваш сценарий с нехваткой памяти, поэтому внутри catch выполните вашу асинхронную задачу. Дайте мне знать, если это сработает, удачи - person Osama_Almaani; 20.02.2014
comment
Однако есть еще одна проблема... в своей деятельности я использую viewpager. Я создаю два фрагмента и присоединяю их к пейджеру представления и время от времени вызываю некоторые методы из этих фрагментов в своей деятельности. не вызывать MyFragment.mymethod().. он говорит, что MyFragment имеет значение null - person laymelek; 20.02.2014
comment
Я действительно не могу понять это поведение цикла, если вы пересмотрите жизненный цикл активности, вы ясно увидите, что удаление приложения из-за потребности в памяти приведет к тому, что приложение полностью перезапустит цикл, начиная с onCreate. Так же, как новый запуск приложения. Это странно, и что касается меня, то у меня нет идей. Кто-то с большим опытом может быть более полезным, чем я :/ - person Osama_Almaani; 20.02.2014
comment
Да... я тоже так думал... почему не все срабатывает в том порядке, в котором должно срабатывать!!! - person laymelek; 20.02.2014
comment
Я также не могу правильно отлаживать, потому что мой отладчик отключается, когда андроид убивает активность при нехватке памяти. - person laymelek; 20.02.2014

В действии получите фрагмент в ViewPager по этому коду

fragment = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.rewards_viewpager + ":"+position);

потом

fragment.doSomething();
person Son Nguyen Thanh    schedule 01.10.2016