Фрагмент транзакции .add vs .relace оптимальная перспектива? - PullRequest
4 голосов
/ 22 апреля 2020

При использовании транзакции фрагмента мы можем сделать их, используя методы add и replace. Если мы используем add, предыдущий фрагмент не уничтожается и сохраняется в памяти. И если мы используем replace, предыдущий фрагмент будет уничтожен и воссоздан снова, когда мы вернемся go. С точки зрения оптимума (память, процессор и т. Д. c), что более эффективно / лучше?

Ответы [ 3 ]

3 голосов
/ 28 апреля 2020

Я создал простое приложение, которое способно заменить или добавить фрагмент, вы можете найти его здесь .

Следуя документации android, я использовал их инструмент для проверки производительности, вот результаты:

add

При добавлении фрагмента использование процессора достигло 17%

replace

При замене фрагмента использование пика процессора составило 23,3%

1 голос
/ 29 апреля 2020

Это зависит от вашего сценария. Заменить, как правило, лучше, поскольку создание новой иерархии не приводит к падению производительности и освобождает иерархию представлений без разрушения экземпляра фрагмента, если вы сохраняете его в свой стек. Однако есть некоторые случаи, о которых вы должны знать, например: вы создаете вид, подобный виду карты. Создание представления с нуля занимает много времени, поэтому вы должны сохранить это представление в памяти, чтобы предотвратить повторное создание представления пользователем в этом фрагменте. Однако, если ваша память начинает достигать границ, вы должны позаботиться об этом, как об уничтожении фрагмента с помощью обратных вызовов памяти. В большинстве случаев замена фрагмента является лучшим вариантом. Вы можете видеть, что происходит, когда вы добавляете свой фрагмент в контейнер, не заменяя предыдущий, не устанавливая фон для ваших фрагментов. Таким образом, если ваши фрагменты занимают так много времени для создания его иерархии представлений, вы сохраняете иерархию представлений посредством транзакций показа и скрываете, не добавляя каждый фрагмент сверху другого. Но если фрагмент имеет упрощенную иерархию представлений для создания, замените его.

1 голос
/ 27 апреля 2020

Если вы говорите об использовании памяти, тогда заменить лучше, чем добавить, потому что в add () представления фрагментов (которые находятся в стеке фрагментов) находятся в памяти, и все изображения и представления занимают память, которая не выпущен. Предположим, у вас есть 5 фрагментов A, B, C, D, E. Вы добавили их один за другим A-> B -> C -> D-> E. Теперь E вверху и все фрагменты A, B, C, D их представления и ресурсы загружены в память. Предположим, что у этих фрагментов много тяжелых изображений, и есть вероятность, что вашему приложению может не хватить памяти. Но если вы используете замену для каждого из них, их представления освобождаются, поэтому их ресурсы освобождаются (что хорошо, так как они больше не видны на экране, поэтому не должны содержать ресурсы, изображения и память).

Для получения дополнительной информации Google представил навигацию Jetpack https://developer.android.com/guide/navigation В этом случае, когда фрагменты перемещаются от одного к другому, выполняется замена.

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

...