Android - стоит ли ViewStub?

У меня есть ListView, где каждая строка списка содержит около 10 ImageButtons. Большинство из этих кнопок имеют видимость = Gone и отображаются только в очень редких сценариях. Мне интересно, стоит ли заменять эти ImageButtons на ViewStubs, чтобы не загружать их (и изображения, которые они содержат) все время для всех строк списка. Затем снова их видимость устанавливается на "Gone", поэтому я не уверен, что сказывается на их загрузке. Действительно ли их изображения загружаются или нет?

Обратите внимание, что я говорю о замене, например. 8 ImageButtons с 8 ViewStubs, а не с 1

Приветствия

Ответ 1

Edit: только что заметил, что Endzeit прокомментировал мое передо мной подобное направление.

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

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

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

Я бы использовал ViewStubs для загрузки сложных макетов не простые ImageButtons.

Изменить 2:

Заглядывая в команду ViewStub inflate, что она делает, когда она должна быть видимой, вы можете видеть, что она подает макет, а затем добавляет его в родительский макет - поскольку вы добавляете простой ImageButton, вы можете получить производительность, а не имея ViewStub и просто добавляя ImageButton в ваш код. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/ViewStub.java#ViewStub.inflate%28%29

Ответ 2

A ViewStub - это представление dumb and lightweight. Он имеет no dimension, он ничего не рисует и никак не участвует в макете. Это означает, что ViewStub очень cheap to inflate and very cheap to keep в иерархии представлений. A ViewStub лучше всего описывать как lazy include. Макет, на который ссылается ViewStub, равен inflated and added только для пользовательского интерфейса when you decide.

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

Для повышения эффективности макета рендеринга используется a ViewStub. Используя ViewStub, ручные представления могут быть созданы, но не добавлены для просмотра иерархии. Во время выполнения можно легко накачивать, а ViewStub раздувается, содержимое ViewStub будет заменено определенным расположением в ViewStub.

ViewStub будет загружаться только тогда, когда вы действительно используете его/нуждаетесь в нем, т.е. когда вы установите его видимость на VISIBLE (фактически видимый) или INVISIBLE (все еще не отображается, но его размер не является 0 больше). ViewStub a nice optimization, потому что у вас может быть сложный layout with tons of small views or headers в любом месте и все еще есть Activity load up really fast. Как только вы используете одно из этих видов, оно будет загружено.

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

Примечание. Один из недостатков ViewStub заключается в том, что он в настоящее время не поддерживает тег <merge/> в раздуваемых макетах. Alos ViewStub не может использоваться более одного раза. Кроме того, сохранение долгоживущей ссылки на ViewStub не требуется, если это необходимо, хорошая практика - обнулить ее после раздувания, поэтому GC может ее съесть.

Предположим, что ваш ViewStub ID view_stub. Вам нужно сделать следующее в activity:

ViewStub viewStub = (ViewStub) findViewById(R.id.view_stub);
View inflatedView = viewStub.inflate();
ImageButton button = (ImageButton) inflatedView.findViewById(R.id.button);

Теперь вы можете делать все, что хотите, с помощью кнопки:) То есть, метод inflate возвращает макет заглушки, который содержит фактические элементы из файла XML.

Конечно, вы всегда можете иметь атрибут onClick XML или его можно динамически вызывать.

Is a ViewStub worth it?
->For the scenarios that you are specifying, I think `ViewStub` will be worth-shot.  

См. ниже ссылки на ViewStub

http://android-developers.blogspot.in/2009/03/android-layout-tricks-3-optimize-with.html

http://developer.android.com/reference/android/view/ViewStub.html

http://developer.android.com/training/improving-layouts/loading-ondemand.html

Вместо ViewStub вы можете попробовать <\include> tag. <include/> будет содержать только содержимое xml в вашем базовом XML файле, как будто все это всего лишь один большой файл. Это хороший способ совместного использования макетов между различными макетами.

Разница между <include> и <ViewStub> в android

Ответ 3

Использование закладки монитора Android в Android Studio (кнопка для монитора Android должна находиться в нижней панели), вы можете проверить ее самостоятельно:

  • Взгляните на использование памяти при запуске приложения с помощью невидимых кнопок
  • Взгляните на использование памяти при запуске приложения с помощью видимых кнопок

Если есть какая-либо разница, вы можете сделать вывод, что при просмотре представлений не все предварительно загружается. Конечно, вы также можете сравнить это с реализацией ViewStub, чтобы проверить, поможет ли это уменьшить использование памяти.

Ответ 4

Короче говоря, используя пользовательский вид вместо viewstub.

У нас сейчас похожая ситуация, и мы также пробовали viewstub раньше, listview работает немного быстрее. Но когда дело доходит до 8 viewstubs, я не думаю, что это хорошая идея использовать viewstub, чтобы не надуть слишком много виджетов.

Так как u (а также мы) имеют логику, чтобы контролировать, показывать или нет 10 кнопок, почему бы просто не определить пользовательский вид и нарисовать разные кнопки в зависимости от другого конечного автомата? Это очень быстро, и никакой инфляции вообще не нужно, и логика намного лучше контролируется. Мы используем этот метод для ускорения списка теперь, и он работает хорошо.

Ответ 5

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

Теперь ListViews удаляют невидимое или позволяют утверждать, что представления, выходящие за пределы экрана, приводят к повышению производительности.

ViewStub - это невидимый вид нулевого размера, который можно использовать для лениво раздувать ресурсы макета во время выполнения.

Итак, я думаю, если вы хотите, по моему мнению, я предпочитаю представления с GONE Visibility, а не используя много логики с ViewStub и создавая и накачивая... и т.д.

Но, с другой стороны,

Эффективность рендеринга приходит в картину при раздувании взгляды.

Моя догадка заключается в том, что гораздо дешевле раздуть ViewStub, чем раздуть представление, либо из XML, либо путем изменения видимости. ViewStub - особенно когда вам нужно добавлять/удалять (неопределенные) представления (например. добавьте номера телефонов к указанному контакту). Надеюсь, это то, чем вы были ищет.

ссылка: ViewStub vs. View.GONE

несколько хороших Краткая презентация DDMS здесь: http://magicmicky.github.io/android_development/benchmark-using-traceview/

Ответ 6

Согласно официальной документации Google здесь.

ViewStub - это легкий вид без измерения, которое ничего не рисует или не участвует в макете. Таким образом, дешево раздувать и дешево оставлять в иерархии взглядов. Каждый ViewStub просто должен включать атрибут android: layout, чтобы указать макет для раздувания.

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

введите описание изображения здесь

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

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

Ответ 7

Используйте ViewStub вместо ImageButton.

Это потому, что

. ViewStub представляет собой нулевой размер по умолчанию, пока кнопка изображения не

. View Stub, естественно, является невидимым. его производительность лучше, чем кнопка изображения, потому что она загружает время выполнения только тогда, когда его состояние становится видимым.