Несколько вещей, о которых нужно позаботиться
1 - не измерять производительность в режиме отладки
Я не могу этого особо подчеркнуть. Запустите без подключенного отладчика, и вы увидите drasti c повышение производительности.
2- сгладьте свой дизайн
Вместо RV, где каждый элемент имеет RV, используйте один RecyclerView с разными ячейками . Таким образом, 1-я ячейка будет «содержимым настенного поста», 2-я будет «ответом на настенный пост 1», 3-я «настенным ответом 2» и т. Д. c.
Я изо всех сил пытался заставить один из моих экранов работать лучше, когда у нас есть горизонтальный RV (viewPager 2 должен быть указан c) с вложенным вертикальным RV, и я преследовал множество тупиков, и в итоге пришлось использовать некоторые трюки, такие как отключение предварительной загрузки предыдущей / следующей страницы, пока текущая страница не будет загружен. Но он НЕ работает после начальной загрузки.
3- Наличие <include
в макетах вряд ли замедлит его.
Но наличие вложенных иерархий делает, например:
<LinearLayout>
<LinearLayout>
<LinearLayout>
Подумайте о том, чтобы переписать все как один ConstraintLayout. Ваш пользовательский интерфейс не так уж и сложен. Удалите несколько вещей, измерьте их и, если станет значительно лучше, сделайте преобразование. Я бы начал с внутреннего макета, поскольку их потенциально больше на одном экране?
и последний
4- будьте осторожны с преобразованием даты
Я заметил, что там - это некоторые методы в ThreeTenAbp, которые отнимают неоправданно много времени. Попробуйте пропустить все эти методы, заменив их фиктивными строками, и проверьте, имеет ли это значение. Если это так, у вас есть несколько вариантов, но это 2 моих первоначальных подозреваемых
- инициализировать форматеры даты только один раз и использовать их в фоновом потоке
- проверьте, что ваши парсеры даты работает в фоновом потоке
Я не удивлюсь, если Java 8 DateTime будет иметь те же проблемы.
============= ===
Написав все вышесказанное, я взглянул на вашу систрасу. На первый взгляд кажется, что виноваты вложенные линейные схемы. Около 1,880 мс я вижу, что очень долгое надувание занимает 30 мс, это большой красный флаг. У него есть 3 линейных макета внутри, которые будут иметь тенденцию указывать в общем направлении либо внутреннего, либо внешнего макета. Поэтому я сначала попробую (3), а если недостаточно, то попробую (2).
============== Изменить: добавление (5 )
5- совместное использование RecycledViewPool для внутреннего recyclerview
Создайте единственный объект типа RecycledViewPool и назначьте его всем вашим внутренним recyclerviews. https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.RecycledViewPool