Intereting Posts
Доступ к локальному хосту: порт с эмулятора Android Как закрыть активность с помощью клавиатуры программного обеспечения после нажатия BACK? Обрабатывать нажатия кнопок в диалоговом окне диалога Изменение цвета панели действий в android Как установить плагин в Android Studio Выбор устройства для Android – мое устройство кажется офлайн Одновременное воспроизведение нескольких композиций с помощью MediaPlayer: только один из них действительно играет Пользовательская фильтрация в Android с помощью ArrayAdapter Android Api 24 не может найти источники Что называется «переход» в документации на Android? Как я могу использовать Android Face Unlock в своем личном приложении? Как подготовить KML-файл для Android Emulator Control? Перетаскивание RecyclerView, которое заполняется из SQLiteDatabase Ошибка сборки Gradle, Ошибка: выполнение выполнено для задачи ': app: transformResourcesWithMergeJavaResForDebug' Окончательные переменные Android

Производительность Android: добавление вида программно и установка представления в GONE / VISIBLE

Я работаю над проектом, который требует раздуть простой учебник «Просмотр», когда пользователь впервые откроет приложение. Я пытаюсь сделать это «правильно», и мне интересно узнать о производительности.

В настоящее время у меня есть в моем макете представление для android:visibility="GONE" , которое я изменяю до VISIBLE зависимости от SharedPreference. Это позволяет мне узнать, как приложение работает при первых запусках.

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

Теперь я думаю об альтернативе: что, если бы я только добавил свой просмотр в первый запуск, но программно, в onCreateView моего фрагмента. Это должно позволить не раздувать представление на более поздних запусках, но не будет ли раздувать представление программным путем, подразумевая плохую производительность при первых запусках?

Solutions Collecting From Web of "Производительность Android: добавление вида программно и установка представления в GONE / VISIBLE"

Поэтому, чтобы ответить на мой собственный вопрос, я использовал инструмент TraceView для отслеживания вызовов из моего фрагмента onAttach до его onResume . Это позволило мне увидеть, какая реализация менее эффективна.

Чтобы выполнить тест, у меня был простой RelativeLayout с FrameLayout внутри него (показано все время). Я использовал индивидуальный макет для добавления каждый раз, либо программно, либо с видимостью GONE в моем файле макета. Пользовательский макет состоял из RelativeLayout с 4 дочерними элементами (ImageView, TextView, View и Button).

Мой onCreateView был следующим, позволяя приложению раздувать правильный макет на основе двух static final boolean констант для изменения макетов.

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LinearLayout root; if(INFLATE_PROGRAMMATICALY) { root = (LinearLayout) inflater.inflate(R.layout.fragment_test_prgmcly, container, false); if(SHOULD_FYI_VIEW_BE_SHOWN) { View tutoView = inflater.inflate(R.layout.inner_view, root, false); root.addView(tutoView); } } else { root = (LinearLayout) inflater.inflate(R.layout.fragment_test_gone,container,false); if(SHOULD_FYI_VIEW_BE_SHOWN) { View tutoView = root.findViewById(R.id.RL_inner_view); tutoView.setVisibility(View.VISIBLE); } } return root; } 

Это приводит к следующим результатам:

Когда дополнительный макет в завышенном

SHOULD_FYI_VIEW_BE_SHOWN=true

Максимальная «оценка в реальном времени», заданная TraceView, составляет 75 мс, когда есть только представление о переходе с GONE на VISIBLE , но на 110 мс, когда нам нужно создать экземпляр inner_view .

Когда необязательный макет не SHOULD_FYI_VIEW_BE_SHOWN=false

В этом случае максимальная оценка в реальном времени, данная TraceView, составляет 102 мс для инфляции отображения GONE , против 39 мс, когда раздутый вид не имеет вида GONE .

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

Вы можете найти тестовый проект на Gist

Я думаю, вы изобретаете колесо. Для этого сценария уже существует инструмент в макетах xml для Android. Он называется ViewStub. Вы можете прочитать здесь: Loading ondemand

Я думаю, что я просто случайно наткнулся на ответ на ваш вопрос о производительности.

Из документов анимации :

Для просмотра, которое исчезает, установите его видимость в GONE. Это предотвращает просмотр пространства макета и исключает его из расчетов компоновки , ускоряя обработку.

Это означало бы, что производительность не будет скомпрометирована до тех пор, пока вы не установите android:visibility для чего-либо еще, кроме GONE .