Разница между FragmentPagerAdapter и FragmentStatePagerAdapter
в чем разница между FragmentPagerAdapter и FragmentStatePagerAdapter?
о FragmentPagerAdapter руководство Google говорит:
эта версия пейджера лучше всего использовать, когда есть несколько
как правило, более статические фрагменты для пролистывания, такие как набор
вешалки. Фрагмент каждой страницы, которую посещает пользователь, будет сохранен
память, хотя ее иерархия представления может быть уничтожена, когда она не видна.
Это может привести к использованию значительного объема памяти, так как фрагмент
экземпляры могут удерживать произвольное количество состояний. Для больших наборов
из страниц рассмотрим FragmentStatePagerAdapter.
и о FragmentStatePagerAdapter:
эта версия пейджера более полезна, когда есть большое количество
страниц, работающих больше как представление списка. Когда страницы не видны
пользователь, весь их фрагмент может быть уничтожен, только сохраняя
сохранено состояние этого фрагмента. Это позволяет пейджеру держаться за многое
меньше памяти, связанной с каждой посещенной страницей по сравнению с
FragmentPagerAdapter за счет потенциально более накладных расходов, когда
переключение между страницами.
так что у меня есть только 3 фрагмента. Но все они представляют собой отдельные модули с большим объемом данных.
Fragment1 обрабатывает некоторые данные (которые пользователи вводят) и передает их через activity в Fragment2, что простоListFragment. Fragment3 тоже ListFragment.
так что мои вопросы являются: Какой адаптер лучше использовать? FragmentPagerAdapter или FragmentStatePagerAdapter?
6 ответов:
как говорят врачи, подумайте об этом таким образом. Если вы должны были сделать приложение, как для чтения книг, вы не хотите, чтобы загрузить все фрагменты в память сразу. Вы хотели бы загрузить и уничтожить
Fragmentsкак пользователь читает. В этом случае вы будете использоватьFragmentStatePagerAdapter. Если вы просто показываете 3 "вкладки", которые не содержат много тяжелых данных (например,Bitmaps), тоFragmentPagerAdapterможет подойдет вам хорошо. Кроме того, имейте в виду, чтоViewPagerпо умолчанию загружает 3 фрагмента в память. ПервыйAdapterвы упомянули может уничтожитьViewиерархия и повторно загрузить его, когда это необходимо, второйAdapterтолько сохраняет состояниеFragmentи полностью уничтожает его, если пользователь затем возвращается на эту страницу, состояние извлекается.
FragmentPagerAdapterхранит весь фрагмент в памяти, и может увеличьте нагрузку на память, если используется большое количество фрагментовViewPager.в противоположность своему брату,
FragmentStatePagerAdapterтолько в магазинах savedInstanceState фрагментов, и уничтожает все фрагменты, когда они теряют фокус.FragmentStatePagerAdapterследует использовать, когда нужно используйте динамические фрагменты, такие как фрагменты с виджетами, в качестве своих данных может быть хранится вsavedInstanceState.Также это не повлияет на производительность, даже если есть большое количество фрагментарный.в противоположность своему брату
FragmentPagerAdapterследует использовать, когда нам нужно сохранить фрагмент в памяти.когда я говорю, что весь фрагмент хранится в памяти, это означает, что его экземпляры не будут уничтожены и создадут накладные расходы памяти. Поэтому рекомендуется использовать
FragmentPagerAdapterтолько при наличии малое количество фрагментов дляViewPager.было бы еще лучше, если бы фрагменты были статическими, так как они будут не иметь большого количества объектов, экземпляры которых были бы на хранении.
более подробно,
FragmentStatePagerAdapter:
С
FragmentStatePagerAdapter,ваш ненужный фрагмент разрушенный.Транзакция совершается для полного удаления фрагмент из вашей деятельностиFragmentManager.государство
FragmentStatePagerAdapterисходит из того, что он спасет ваш фрагментBundleСsavedInstanceStateкогда он уничтожен.Когда пользователь перейдет назад,новый фрагмент будет восстановлено с использованием состояния фрагмента.FragmentPagerAdapter:
по сравнению
FragmentPagerAdapterничего подобного.Когда фрагмент больше не нужен.FragmentPagerAdapterвызовыdetach(Fragment)на транзакция вместоremove(Fragment).это уничтожить вид фрагмента, но оставляет экземпляр фрагмента живые в
FragmentManager. так что фрагменты, созданные вFragmentPagerAdapterникогда не уничтожаются.
что-то, что явно не сказано в документации или в ответах на этой странице (хотя и подразумевается @Naruto), это
FragmentPagerAdapterне будет обновлять фрагменты, если данные во фрагменте изменяются, потому что он сохраняет фрагмент в памяти.поэтому, даже если у вас есть ограниченное количество фрагментов для отображения, если вы хотите иметь возможность обновлять свои фрагменты (например, вы повторно запускаете запрос для обновления listView во фрагменте), вам нужно использовать FragmentStatePagerAdapter.
вся моя точка зрения заключается в том, что количество фрагментов и то, похожи они или нет, не всегда является ключевым аспектом для рассмотрения. Независимо от того, являются ли ваши фрагменты динамическими, также является ключевым.
вот жизненный цикл журнала каждого фрагмента в
ViewPagerкоторые имеют 4 фрагмента иoffscreenPageLimit = 1 (default value)FragmentStatePagerAdapter
перейти к Fragment1 (начало деятельности)
Fragment1: onCreateView Fragment1: onStart Fragment2: onCreateView Fragment2: onStartперейти к Fragment2
Fragment3: onCreateView Fragment3: onStartперейти к фрагменту 3
Fragment1: onStop Fragment1: onDestroyView Fragment1: onDestroy Fragment1: onDetach Fragment4: onCreateView Fragment4: onStartперейти к Fragment4
Fragment2: onStop Fragment2: onDestroyView Fragment2: onDestroyFragmentPagerAdapter
перейти к Fragment1 (запуск активность)
Fragment1: onCreateView Fragment1: onStart Fragment2: onCreateView Fragment2: onStartперейти к Fragment2
Fragment3: onCreateView Fragment3: onStartперейти к фрагменту 3
Fragment1: onStop Fragment1: onDestroyView Fragment4: onCreateView Fragment4: onStartперейти к Fragment4
Fragment2: onStop Fragment2: onDestroyViewвывод:
FragmentStatePagerAdapterвызовonDestroyкогда фрагмент преодоленoffscreenPageLimitпокаFragmentPagerAdapterнет.Примечание: я думаю, что мы должны использовать
FragmentStatePagerAdapterнаViewPager, которые имеют много страниц, потому что это будет хорошо для производительности.пример of
offscreenPageLimit:если мы перейдем к фрагменту 3, это будет часто занимает высокие ресурсы Fragment1 (или Fragment5 если есть), потому что
offscreenPageLimit = 1. Если мы установимoffscreenPageLimit > 1это не будет уничтожить.
Если в этом примере мы задаемoffscreenPageLimit=4, нет никакой разницы между использованиемFragmentStatePagerAdapterилиFragmentPagerAdapterпотому что фрагмент никогда не звонитonDestroyViewиonDestroyкогда мы меняем вкладке
FragmentPagerAdapterсохраняет предыдущие данные, которые извлекаются из адаптера, аFragmentStatePagerAdapterпринимает новое значение от адаптера каждый раз, когда он выполняется.
FragmentStatePagerAdapter = для размещения большого количества фрагментов в ViewPager. Поскольку этот адаптер уничтожает фрагмент, когда он не виден пользователю, и только savedInstanceState фрагмента сохраняется для дальнейшего использования. Таким образом, используется небольшой объем памяти и обеспечивается более высокая производительность в случае динамических фрагментов.
Comments