1

Я не могу на всю жизнь понять, почему иногда мои Фрагменты становятся неуправляемыми после того, как мое приложение было запущено, приостановлено, а затем возобновлено.ViewPager Фрагменты, которые уничтожаются, когда приложение находится в фоновом режиме?

Я держу ссылки на мои фрагментах, как это:

public class MainActivity ... { 

    public static AccountFragment accountFragment; 
    .... 

    @Override 
    protected void onCreate(... { 

     accountFragment = new AccountFragment(this); 
     ... 
    } 

У меня есть пользовательская панель инструментов с Spinner, который теоретически должен позволить пользователю вызвать AsyncTask в AccountFragment для запуска. Это реализуется следующим образом:

if (accountFragment.getView() != null) { 

    accountFragment.load() 
} 

Я затем создать ViewPager, а FragmentPagerAdapter и т.д.

Это полностью работает отлично большую часть времени. Пользователь может выбрать новый элемент в Spinner и соответствующим образом обновить AccountFragment. Однако иногда после того, как приложение было остановлено, а затем возобновлено, AccountFragment вообще ничего не ответит. Даже другие мнения в приложении, которые должны влиять на AccountFragment, бесполезны. Для меня это не имеет смысла, поскольку представление AccountFragment не может быть нулевым, а AsyncTask, выполняемый accountFragment.load(), вносит очень простые изменения в пользовательский интерфейс в onPreExecute, который должен быть очень заметным (например, все исчезает и появляется ProgressBar), которого просто не происходит.

Любые идеи?

ответ

1

Недостаточно кода, чтобы точно знать, что здесь происходит, но есть и куча вещей, которые вы делаете неправильно.

1) Не храните ссылку на фрагмент в поле public static. Сделайте это всего private, или protected не более. Прочтите основные руководства по Java для объяснения.

2) Не перегружайте конструктор фрагмента, его обескураживает дизайн. Если вам нужно передать некоторые значения, сделайте это, используя аргументы.

3) Думаю, вы не выполняете проверку в течение onCreate() метода в своей деятельности, если он воссоздан или только что создан. Вы могли бы получить два экземпляра AccountFragment, где один из них находится в каком-то странном состоянии.

...

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

+0

Спасибо за всесторонний ответ! 1: Хорошо, я сделаю это. 2: Мои фрагменты каким-то образом нуждаются в ссылке на мою MainActivity. Как иначе это должно быть сделано? 3: Как я могу определить, воссоздает ли onCreate или создается ли он недавно? Что бы я сделал по-другому, если бы обнаружил, что он воссоздан? – zholmes1

+0

Ваш фрагмент имеет метод getActivity(). Вы можете отбросить возвращенную активность в свою MainActivity. Что касается отдыха: если savedInstanceState в методе onCreate() имеет значение null, то обычно это означает, что активность только что создана. Если он не является нулевым, он воссоздается. –

+0

Считаете ли вы, что, может быть, вокруг моего экземпляра моих фрагментов может быть следующее, если блок может работать?if (savedInstanceState == null) {// экземпляр фрагментов} – zholmes1

Смежные вопросы