При настройке данных на Android сохраняется фрагмент до вызова onCreate()

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

Моя цель состоит в том, чтобы onCreate() Activity активировал длительную сетевую операцию, потому что я хочу, чтобы она запускалась только тогда, когда активность создается, а не каждый раз, когда она начинается снова (в противном случае я бы поместил ее в onStart()).

Для этого я сначала создаю сохраненный фрагмент в onCreate Activity, затем с помощью FragmentManager добавляю сохраненный фрагмент, затем запускаю сетевой вызов в методе onCreate Activity и передаю сетевой объект оставшемуся фрагменту для удержания.

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

Является ли плохой практикой использование сохраненного экземпляра Fragment до того, как фрагмент запустит свой метод onCreate()?

РЕДАКТИРОВАТЬ После прочтения ответов и немного подумав об этом, я понимаю, что инициирование сетевого вызова из Activity onCreate(), хотя и удобно, рискованно делать. Как отмечено в ответах, существует вероятность того, что длительная операция возвращается очень быстро и пытается манипулировать видом действия, которое, возможно, еще не было инициализировано. Поэтому в моем конкретном случае я прибегаю к запуску длительной операции из метода onStart () Activity, а затем к ее кешу использую retained Fragment. Таким образом, даже если onStart () вызывается несколько раз и пытается снова запустить длительную операцию, результат с первой попытки будет кэширован и может быть возвращен.

2 ответа

Решение

Я признаю, что это необычно, но я не могу придумать причину, почему это было бы плохо. Преимущество сохраненного фрагмента состоит в том, что ссылка на фрагмент не уничтожается, поэтому ссылки, к которым он относится, также сохраняются. onCreate() а также onDestroy() Вызываются один раз за время существования фрагмента (когда фрагмент добавляется и удаляется соответственно).

Опасность может заключаться в том, что асинхронная операция заканчивается раньше, чем onCreate() называется. Аналогично, операция может закончиться после onDestroy() и когда вы ожидаете, что фрагмент будет запущен. Есть несколько методов, таких как Fragment#setArguments() что нельзя назвать во время некоторых частей Fragment's жизненный цикл. Если бы вы вызывали эти методы, когда ожидали Fragment быть запущенным, тогда вы получите исключение. Таким образом, вы в конечном итоге должны поставить кучу чеков, как if(isAttached()) { /* do this */ }, Помещение операции в onCreate() будет гарантировать, что он хотя бы начался до завершения операции.

Но если вы на самом деле не полагаетесь ни на Fragment's функциональность, то все должно быть в порядке. Жизненные циклы предназначены только для того, чтобы рассказать вам, что происходит с ним.

Пока вы не полагаетесь на то, что представления "Деятельность" / "Фрагмент" доступны во время просмотра фрагмента. onCreate, с тобой все будет в порядке:

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

( https://developer.android.com/reference/android/app/Fragment.html

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

Другие вопросы по тегам