Вопрос по android-viewpager, android, android-fragmentactivity, android-fragments – Почему мой фрагмент onCreate часто вызывается всякий раз, когда я просматриваю мои приложения viewPager?

8

Я не совсем понимаю этот бизнес жизненного цикла фрагмента.

У меня довольно стандартный трехстраничный горизонтальный слайдер с видом макета пейджера для просмотра подробностей. раздел моего приложения. Я запускаю свое приложение на средней странице трех. Моя FragmentActivity устанавливает страницу на страницу 1.

mPager.setCurrentItem(1); //default to center page, current data view fragment

Я использовал FragmentStatePagerAdapter, потому что использование FragmentPagerAdapter иногда приводило к сбою моего приложения, например, когда он возвращался из приостановленного состояния, и на данный момент это был самый быстрый способ обойти это. Кажется, работает, но я подозреваю, что государственный аспект, возможно, является причиной моей проблемы здесь.

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

Я попытался запустить уникальную асинхронную задачу для извлечения данных в каждом из фрагментов событий onCreateView. Затем, прочитав больше о жизненном цикле фрагмента, я переключился на onCreate, заметив, что onCreateView вызывается довольно сильно, что, в свою очередь, создало жадное приложение, которое слишком часто запрашивало данные по проводам.

Переключение на onCreate ничего не изменило. OnCreate по-прежнему вызывается так же, как onCreateView для 2 смежных фрагментов.

Странно то, что фрагмент, который я установил как первый, который будет отображаться в Fragment Activity, вызывает onCreate только один раз.

Что-то здесь не так.

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

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

подписанный, смущенный и разочарованный

Ваш Ответ

2   ответа
25

что не использует в данный момент, и это именно то, что здесь происходит. Поведение по умолчанию для ViewPager & quot; держать вокруг & quot; одну страницу по обе стороны от просматриваемой страницы, а остальные уничтожить. Следовательно, при просмотре трех страниц страница 3 разрушается при выборе страницы 1, а затем при повторном выборе страницы 2 страница 3 создается заново. Как вы заметили, на странице 2 есть толькоonCreate(..) вызывается один раз, потому что он всегда находится рядом или является текущей выбранной страницей.

Чтобы решить эту проблему, просто установитеViewPager.setOffscreenPageLimit(2), Тогда ViewPager сохранит все ваши фрагменты. Очевидно, что это не очень хорошая идея для большого количества фрагментов, но для вашего случая это должно быть хорошо.

Я также попал в ловушку в этом выпуске. Теперь приступил к работе. Большое спасибо.
Да, единственная проблема, с которой я мог столкнуться, это то, что пользователь поворачивает устройство во время работы AsyncTask. У меня нет большого опыта с ними как бы то ни было. Возможно, стоит проверить класс AsyncTaskLoader, я считаю, что классы Loader автоматизируют множество вещей для вас.
о, это звучит полезно попробовать. так что, эй, кажется ли, что запуск асинхронных задач из фрагмента onCreate является стандартным способом? прямо сейчас я запускаю три отдельные асинхронные задачи, как только загружается мой фрагмент Activity, правильно или неправильно .... topwik
Очень хорошее решение для парней, которые используют только несколько вкладок, которые не занимают много памяти (со своей стороны я использую 3). Более того, код будет намного легче поддерживать (легко управлять циклом запуска / остановки!)
Боже, храни ... спас мне жизнь
2

но вы правы в том, что проблема в вашем штате. Вы должны использоватьsetArgument и / илиonSaveInstanceState методы, чтобы сохранить вашиFragmentсостояние (которое не должно быть слишком сложным, поскольку, например, ответ от сервера обычно может быть представлен в виде строки), а затем использоватьgetArgument и / илиBundle прошло вonCreate восстановить его.

Кроме того, вы могли бы иметьActivity сделать сервер выборки, а затем вызватьsetArgument для каждого из ваших фрагментов, и проверьте аргументы внутри вашегоFragment определить, поступили ли еще ваши данные (и, если нет, потенциально отображать какое-либо состояние загрузки).

Если вам небезразлично изменение ориентации экрана,этот связанный вопрос Также будет полезно для вас.

Спасибо чувак. Я ценю ответ. я хотел продолжить, "что если бы у меня было еще много фрагментов в этом пейджере" .... topwik

Похожие вопросы