Intereting Posts
Android Studio на аппаратном обеспечении, не поддерживающем технологию виртуализации Изменение макета Xml при изменении ориентации Получение текущей позиции ViewPager Как узнать, работает ли мое приложение с Robolectric? Почему мой OnLocationChanged () никогда не вызван? Кэш зависимостей Gradle может быть поврежден Что это означает с сообщением об ошибке, снятым в Android-планшете? Запрос базы данных Google Play Музыки на Android StartActivityForResults всегда возвращает RESULT_CANCELLED для Intent.ACTION_SEND Ошибка проверки включенности Bluetooth в Android (REQUEST_ENABLE_BT не может быть разрешен переменной) Как определить физический объект в Android Augmented Reality? Ресурс был получен при подключенной трассировке стека, но никогда не был выпущен – Ошибка Intellij Idea log GradleConnectionException: не удалось выполнить сборку с использованием установки Gradle при построении Легче ли поставлять один ресурс PNG с высоким разрешением и позволить Android масштабировать его? Есть ли более простой / лучший способ поместить границу / контур вокруг моего TextView?

Android – стоит ли ViewStub?

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

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

ура

Solutions Collecting From Web of "Android – стоит ли ViewStub?"

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

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

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

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

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

Изменить 2:

Заглядывая в команду ViewStub inflate, что она делает, когда она должна быть видимой, вы можете видеть, что она infaltes расклассифицирована, а затем добавляет ее в родительский макет – поскольку вы добавляете простой 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

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

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

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

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

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

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

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

 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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