Есть несколько вещей, которые вы можете сделать для повышения производительности.
Выясните, что именно медленно
Узнайте о профилировании, которое может сказать вам, какие функции вызываютсясамый и / или который занимает больше всего времени для завершения.Таким образом, вы можете решить, куда тратить время на исправление или изменение кода.
См. https://developer.android.com/studio/profile/android-profiler и https://developer.android.com/studio/profile/
Шаблон ViewHolder
Вы неправильно используете Шаблон ViewHolder .В вашем коде у вас есть один экземпляр ViewHolder
в поле viewHolder
адаптера.Затем вы используете это поле внутри функции getView()
как обычная локальная переменная.
Затем вы вызываете row.findViewById()
несколько раз, даже если convertView
не было null
.Вызовы findViewById()
являются медленными, и преимущество держателя представления состоит в том, что вам нужно вызывать его только один раз для представления после раскрытия (в нулевой ветви convertView == if
).
Вместоу вас должно быть 1 держатель на просмотр строки.Обратите внимание, что вы не создаете новый ViewHolder
для назначения с setTag()
, но вы используете тот же самый.Тогда вместо переменных, таких как descr
, ttl
, city
, должны быть поля ViewHolder
и, следовательно, они могут быстро ссылаться.
Создание ненужных объектов
Распределение памятитакже медленный.
Вы также создаете объекты каждый раз, когда вызывается getView()
, который вы можете создать один раз и просто использовать повторно.
Одним из таких примеров является SimpleDateFormat
, который можетСоздайте его один раз в конструкторе адаптера и просто используйте для создания текста.
Посмотрите, как можно избежать создания стольких String
объектов.Форматирование с помощью строкового буфера или чего-то подобного.Вы не показываете исходный код для класса Exhibition
, поэтому неясно, почему существует необходимость создания Date
объекта с результатом вызова getStart()
и getEnd()
.
Если поля 'start' и 'end' объектов Exhibition
никогда не используются как long
s, рассмотрите возможность превращения их в неизменяемые Date
s во время анализа JSON вместо каждого их использования.
Потенциальные медленные вызовы в потоке пользовательского интерфейса
Исходный код класса Exhibition
не показан, поэтому мы не можем сказать, что делает функция Exhitition.getHeader()
.Если имеется загрузка и / или декодирование растрового изображения, перемещение его в фоновый поток (и обновление после того, как растровое изображение будет готово) улучшит производительность прокрутки ListView
.
Ненужные вызовы
Тамзвонки, которые выполняются, даже если они не нужны.Например, назначение прослушивателя «По щелчку» в конце getView()
.Вы можете избежать установки только один раз, когда вы выполняете накачивание (когда convertView
равно null
), поскольку все строки используют один и тот же слушатель.
Избегайте заполнения памяти
Youупомянул, что каждый объект Exhibition
имеет поле Bitmap
, которое устанавливается при разборе JSON.Это означает, что все растровые изображения постоянно находятся в памяти.Это означает, что в этом случае кэш-память LRU не требуется, поскольку всегда существует сильная ссылка на растровые изображения.
Это также означает, что по мере увеличения количества элементов в списке необходимая память увеличивается.Поскольку используется больше памяти, сбор мусора (GC) должен происходить чаще, и GC работает медленно и может вызвать заикание или зависание.Профилирование может сказать вам, происходит ли зависание, которое вы испытываете из-за GC.
Кэш растрового изображения был бы полезен, если бы в памяти было только несколько растровых изображений, которые необходимы для элементов, которые в настоящее времявиден в списке и еще несколько.Если нужное растровое изображение не найдено в кеше, его следует загрузить с диска или загрузить из сети.
PS
Имейте в виду, что у вас есть общедоступная функция setOnCustomClickListener()
, которая назначает толькоссылка на поле.Если вы вызываете это с новым слушателем, ваш текущий код будет использовать старый слушатель во всех строках, которые не были обновлены и обновлены с новой ссылкой.