Приложение Android очень медленно загружается с несколькими фрагментами в пейджере просмотра

[![введите описание изображения][1]][1]Я схожу с ума. В моем приложении есть пейджер просмотра с 6 фрагментами. Каждый фрагмент имеет подфрагменты в другом просмотровом пейджере (~ 4 фрагмента для каждого основного фрагмента). Итак, общее количество фрагментов составляет около 6x4 = 24 фрагмента. Я установил viewPager.setOffscreenPageLimit(максимальное количество фрагментов); для всех просмотров пейджера, чтобы прокрутка была быстрой, а не тормозной

Проблема: очень медленная загрузка приложений, которая варьируется от устройства к устройству, например:

Lenovo K10 note (L38111) Телефон Телефон — 6 ГБ ОЗУ — 2x2,2 ГГц: загружается за 5 секунд Телефон Samsung Galaxy A02s (SM-A025F/DS.) — 3 ГБ ОЗУ — 1,8 ГГц: загружается за 90 секунд
Телефон Samsung Galaxy A14 — 4 ГБ ОЗУ: загружается за 45 секунд
Samsung Galaxy TAB A — Планшет — 2 ГБ ОЗУ — 2,0 ГГц: загружается за 7 секунд
Samsung Galaxy S6 Lite — планшет — 4 ГБ ОЗУ: загружается за 21 секунду

Как ускорить время запуска приложения, чтобы оно было <10 секунд. И почему время загрузки варьируется, хотя в некоторых системах Android с более высокими характеристиками оно медленное.

Обновление: объем памяти остается на уровне 64 МБ в течение примерно 70 секунд, затем увеличивается до 140 МБ всего за 3 секунды до загрузки приложения.

ОБНОВЛЯТЬ -------------------------------------------

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

View final_view = inflater.inflate(R.layout.loading_view, container, false);
 ProgressBar progressBar = (ProgressBar)final_view.findViewById(R.id.progressBar);

AsyncLayoutInflater asyncInflater = new AsyncLayoutInflater(getActivity());
asyncInflater.inflate(R.layout.customersms_frg, container, new AsyncLayoutInflater.OnInflateFinishedListener() {
    @Override
    public void onInflateFinished(View v, int resid, ViewGroup parent) {

        unbinder = ButterKnife.bind(Customer_SMS.this, v);
       progressBar.setVisibility(View.GONE);
       if (final_view instanceof ViewGroup) {
           ViewGroup viewGroup = (ViewGroup) final_view;
            viewGroup.addView(v);
        }
    }
});

return final_view;

Проблема :

приложение запускается через 6 секунд, что для меня здорово. Однако кажется, что основной пользовательский интерфейс заблокирован. т. е. когда пользователь прокручивает пейджер, чтобы перейти ко второму фрагменту, >> приложение не отвечает в течение ~ 20 секунд, затем происходит прокрутка. Я прикрепил трассировку своего приложения к https://drive.google.com/file/d/1-Iw1NsF_GBGbKa8dsgzFsZl9xWIHpB9O/view?usp=sharing

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

dominicoder 02.06.2024 00:27
0
1
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  1. Профилируйте свое приложение.
  2. Определите узкое место (узкие места).
  3. Оптимизировать.
  4. Возвращайтесь к 1, пока не будете удовлетворены.

Если замедление связано с раздуванием макетов, посмотрите AsyncLayoutInflater.

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

«Высшие характеристики системы» — это одна (или несколько) из множества переменных. Все ли эти устройства имеют одинаковую версию ОС? Дисковое пространство? Приложения установлены? Приложения работают в фоновом режиме? Уровень заряда батареи? И т. д. и т. п.?

Я полностью с тобой согласен . Я запустил приложение «Профиль». но я вижу диаграмму памяти, процессора и энергии. где проверить, какая функция занимает много времени? специально Into. logcat, я вижу, что приложение зависает примерно за 40 секунд до отображения основной активности

waleed.makarem 30.05.2024 19:42

Скорость приложения в первую очередь определяется процессором, поэтому начните с него. developer.android.com/studio/profile/cpu-profiler

dominicoder 30.05.2024 20:14

Диаграмма профиля ЦП кажется очень стабильной. Я заметил, что объем памяти остается на уровне 60 МБ в течение примерно 50 секунд, а затем увеличивается до 140 МБ всего за 2 секунды до отображения основной активности приложения.

waleed.makarem 30.05.2024 20:33

Хорошо, так что профилируйте и свою память. Загрузка 24(!) фрагментов в память съест довольно много оперативной памяти, а выделение этой памяти займет некоторое время, поэтому увеличение памяти и загрузка процессора неудивительны.

dominicoder 30.05.2024 21:15

С учетом вышесказанного, действительно ли вам нужно, чтобы 24 фрагмента были постоянно загружены и готовы, чтобы все «не тормозило»? Со сколькими из этих 24 фрагментов среднестатистический пользователь фактически будет взаимодействовать в течение данного сеанса?

dominicoder 30.05.2024 21:18

ты прав. Я удалил некоторые фрагменты, и приложение загружается быстрее. Но есть ли способ загрузить фрагменты в поток. Мне просто нужно иметь хороший пользовательский опыт, а не ждать 30 секунд, пока загрузится фрагмент. Примечание. Я добавил скриншот для Profiler

waleed.makarem 30.05.2024 21:48

в среднем нужно всего 5 фрагментов, но, если он захочет использовать другие, то он загрузится за 30 секунд, что очень долго. Я думаю о ленивой загрузке фрагментов в фоновом режиме. будет ли это хорошей практикой?

waleed.makarem 30.05.2024 22:17

Фрагменты, как элементы пользовательского интерфейса, должны создаваться и загружаться в основной поток. 30 секунд на загрузку одного фрагмента — это абсурд. Вам нужно определить, что занимает так много времени, и переместить это в фоновый поток/сопрограмму. Если замедление связано с раздуванием макетов, посмотрите AsyncLayoutInflater

dominicoder 30.05.2024 22:20

проверил AsyncLayoutInflater, выглядит многообещающе для ускорения загрузки приложения, но фрагмент пуст. Код OnCreateview: AsyncLayoutInflater asyncInflater = new AsyncLayoutInflater(getActivity()); asyncInflater.inflate(R.layout.showmenu,Container, new AsyncLayoutInflater.OnInflateFinishedListener() { @Override public void onInflateFinished(View view, int resid, родительский элемент ViewGroup) { unbinder = ButterKnife.bind(ShowMenu.this, view); initSmartTab( представление); InitializeTitleBar (представление); вернуть ноль;

waleed.makarem 31.05.2024 18:37

Кажется, что такая задержка в основном связана с раздуванием макета, хотя и не таким уж сложным. Например, у меня есть часть xml, содержащая Linearlayout с 8 текстовыми сообщениями, >> это сократило общее время загрузки на 3 секунды. сумасшедший !!

waleed.makarem 01.06.2024 00:01

Я успешно реализовал AsyncLayoutInflater, приложение загружается за 6 секунд. исходный загружен успешно. ,но приложение зависает примерно на 15 секунд. т.е. при нажатии любой кнопки в первом фрагменте ничего не происходит до тех пор, пока не пройдет 15 секунд. мой общий код для инфляции фрагментов приведен ниже. Я не думаю, что это связано с инфляцией, которая выполняется успешно, но связано с другими задачами основного потока. но не могу найти. вернуть окончательный_просмотр;

waleed.makarem 01.06.2024 15:38

мой код: Просмотр Final_view = inflater.inflate(R.layout.loading_view,Container, false); ProgressBar ProgressBar = (ProgressBar)final_view.findViewById(R.id.progressBar); AsyncLayoutInflater asyncInflater = новый AsyncLayoutInflater(getActivity()); asyncInflater.inflate(R.layout.customersms_frg, контейнер, новый AsyncLayoutInflater.OnInflateFinishedListener() {

waleed.makarem 01.06.2024 15:39

@Override public void onInflateFinished (View v, int resid, родительский элемент ViewGroup) { unbinder = ButterKnife.bind (Customer_SMS.this, v); ProgressBar.setVisibility(View.GONE); если (final_view instanceof ViewGroup) {ViewGroup viewGroup = (ViewGroup) Final_view; viewGroup.addView(v); } } }); вернуть окончательный_просмотр;

waleed.makarem 01.06.2024 15:39

мне поделиться файлом трассировки?

waleed.makarem 01.06.2024 19:54

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

dominicoder 01.06.2024 20:11

Вопрос дополнен примером кода для AsyncLayoutinflator, а также прикреплена ссылка на запись трассировки приложения.

waleed.makarem 01.06.2024 23:17

dominicoder: можете ли вы оставить свой комментарий для asynclayoutinflator, чтобы я мог установить его в качестве ответа?

waleed.makarem 05.06.2024 22:29

Я обновил свой ответ этим комментарием.

dominicoder 07.06.2024 00:25

Другие вопросы по теме