Разница между FragmentPagerAdapter и FragmentStatePagerAdapter



в чем разница между FragmentPagerAdapter и FragmentStatePagerAdapter?



о FragmentPagerAdapter руководство Google говорит:




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




и о FragmentStatePagerAdapter:




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




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



Fragment1 обрабатывает некоторые данные (которые пользователи вводят) и передает их через activity в Fragment2, что простоListFragment. Fragment3 тоже ListFragment.



так что мои вопросы являются: Какой адаптер лучше использовать? FragmentPagerAdapter или FragmentStatePagerAdapter?

614   6  

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: onDestroy

FragmentPagerAdapter

перейти к 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

    Ничего не найдено.