[![введите описание изображения][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
Как ускорить время запуска приложения, чтобы оно было <10 секунд.
Если замедление связано с раздуванием макетов, посмотрите AsyncLayoutInflater.
И почему время загрузки варьируется, хотя в некоторых системах Android с более высокими характеристиками оно медленное.
«Высшие характеристики системы» — это одна (или несколько) из множества переменных. Все ли эти устройства имеют одинаковую версию ОС? Дисковое пространство? Приложения установлены? Приложения работают в фоновом режиме? Уровень заряда батареи? И т. д. и т. п.?
Я полностью с тобой согласен . Я запустил приложение «Профиль». но я вижу диаграмму памяти, процессора и энергии. где проверить, какая функция занимает много времени? специально Into. logcat, я вижу, что приложение зависает примерно за 40 секунд до отображения основной активности
Скорость приложения в первую очередь определяется процессором, поэтому начните с него. developer.android.com/studio/profile/cpu-profiler
Диаграмма профиля ЦП кажется очень стабильной. Я заметил, что объем памяти остается на уровне 60 МБ в течение примерно 50 секунд, а затем увеличивается до 140 МБ всего за 2 секунды до отображения основной активности приложения.
Хорошо, так что профилируйте и свою память. Загрузка 24(!) фрагментов в память съест довольно много оперативной памяти, а выделение этой памяти займет некоторое время, поэтому увеличение памяти и загрузка процессора неудивительны.
С учетом вышесказанного, действительно ли вам нужно, чтобы 24 фрагмента были постоянно загружены и готовы, чтобы все «не тормозило»? Со сколькими из этих 24 фрагментов среднестатистический пользователь фактически будет взаимодействовать в течение данного сеанса?
ты прав. Я удалил некоторые фрагменты, и приложение загружается быстрее. Но есть ли способ загрузить фрагменты в поток. Мне просто нужно иметь хороший пользовательский опыт, а не ждать 30 секунд, пока загрузится фрагмент. Примечание. Я добавил скриншот для Profiler
в среднем нужно всего 5 фрагментов, но, если он захочет использовать другие, то он загрузится за 30 секунд, что очень долго. Я думаю о ленивой загрузке фрагментов в фоновом режиме. будет ли это хорошей практикой?
Фрагменты, как элементы пользовательского интерфейса, должны создаваться и загружаться в основной поток. 30 секунд на загрузку одного фрагмента — это абсурд. Вам нужно определить, что занимает так много времени, и переместить это в фоновый поток/сопрограмму. Если замедление связано с раздуванием макетов, посмотрите AsyncLayoutInflater
проверил 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 (представление); вернуть ноль;
Кажется, что такая задержка в основном связана с раздуванием макета, хотя и не таким уж сложным. Например, у меня есть часть xml, содержащая Linearlayout с 8 текстовыми сообщениями, >> это сократило общее время загрузки на 3 секунды. сумасшедший !!
Я успешно реализовал AsyncLayoutInflater, приложение загружается за 6 секунд. исходный загружен успешно. ,но приложение зависает примерно на 15 секунд. т.е. при нажатии любой кнопки в первом фрагменте ничего не происходит до тех пор, пока не пройдет 15 секунд. мой общий код для инфляции фрагментов приведен ниже. Я не думаю, что это связано с инфляцией, которая выполняется успешно, но связано с другими задачами основного потока. но не могу найти. вернуть окончательный_просмотр;
мой код: Просмотр 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() {
@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); } } }); вернуть окончательный_просмотр;
мне поделиться файлом трассировки?
Обновите исходный вопрос, добавив дополнительную информацию, например фрагменты кода. Ваши примеры кода в комментариях практически неразборчивы.
Вопрос дополнен примером кода для AsyncLayoutinflator, а также прикреплена ссылка на запись трассировки приложения.
dominicoder: можете ли вы оставить свой комментарий для asynclayoutinflator, чтобы я мог установить его в качестве ответа?
Я обновил свой ответ этим комментарием.
У меня (и я предполагаю, что у других) нет времени или желания анализировать вашу трассировку без контекста того, что делает ваш код. Опять же, профилируйте свой код, проанализируйте трассировку самостоятельно, определите узкие места, оптимизируйте или выгрузите в фоновый поток, промойте и повторите. Удачи.