Моя деятельность заключается в загрузке и отображении объявлений (из веб-службы объявлений). Чтобы пользовательский интерфейс реагировал, я выполняю следующие действия в фоновых потоках:
1) загрузить XML (данные хранятся в XML),
2) обрабатывать XML,
3) загрузка изображений.
Кроме того, я меняю приоритеты пользовательского интерфейса и фоновых потоков, чтобы обеспечить адаптивность потока пользовательского интерфейса:
в основной теме:
Thread.currentThread().setPriority(10);
в фоновых темах:
Thread.currentThread().setPriority(1);
Каждое объявление помещается в TableRow, а каждое TableRow помещается в TableView с использованием обработчика.
Когда пользователь прокручивает TableView и собирается достичь конца таблицы, добавляются новые строки и отправляется HTTP-GET для следующих объявлений (+ разбор (с использованием XPath) + загрузка изображений + заполнение строк таблицы содержимым).
Моя проблема:
при загрузке и разборе процесса пользовательский интерфейс реагирует лишь частично (каждый раз, когда пользователь прокручивает TableView, имеется несколько задержек 0,1-0,5 с).
Я хочу сделать абсолютно плавную прокрутку, которая не зависит от загрузки / обработки данных.
Что было сделано неправильно и что еще можно сделать здесь?
Например, если я уменьшу количество операций в обработчике, это должно улучшить отзывчивость ... может быть, так. Однако я не вижу там тяжелых и трудоемких инструкций.
UPDATE
Я переписал свой код, используя ListView вместо TableLayout, поскольку первый значительно быстрее (как оказалось, я этого не знал). Но у меня все еще есть всплески, когда обработка XML и прокрутка ListView происходили одновременно. Я сделал 2 эксперимента:
1) Я удалил все фоновые процессы - новые строки были добавлены в ListView при прокрутке вниз, но данные для этих строк не обрабатывались (поэтому они оставались пустыми) - такой вариант работал отлично, никакого скачка, пользовательский интерфейс абсолютно отзывчивый.
2) 2-й эксперимент состоял в том, чтобы удалить вызовы обновлений ListView (файл XML был обработан, но найденные данные не были переданы адаптеру ListView) - в этот раз у меня были всплески. Поэтому я пришел к выводу, что эти всплески связаны с фоновыми потоками, а не с вызовами обновления пользовательского интерфейса.
Как фоновые потоки могут замедлить мое приложение, если я сделаю так, чтобы они имели более низкий приоритет, чем приоритет основного?
Есть
Thread.currentThread().setPriority(some_int);
правильный способ установить приоритет потока?