Моя активность - загрузить и отобразить объявления (с веб-сервиса объявлений). Для того, чтобы сохранить пользовательский интерфейс отзывчивый я следующие действия в фоновых потоков:Android: использование многопоточности для обеспечения пользовательского интерфейса (сглаживание гладкой прокрутки)
1) загрузить XML (данные хранятся в XML),
2) процесс XML,
3) загружать изображения.
Кроме того, я меняю приоритеты пользовательского интерфейса и фоновых потоков держать UI нить отзывчивым:
в основном потоке:
Thread.currentThread().setPriority(10);
в фоновых потоков:
Thread.currentThread().setPriority(1);
Каждое объявление ставится в TableRow, и каждый TableRow помещается в TableView с помощью обработчика. Когда пользователь прокручивает TableView и приближается к концу таблицы, добавляются новые строки и отправляется HTTP-GET для следующих объявлений (+ parcing (используя XPath) + загрузка изображения + заполнение строк таблицы содержимым).
Моя проблема:
при загрузке и синтаксического анализа в процессе пользовательского интерфейса только частично реагирует (существует целый ряд лагов 0.1-0.5sec каждый, когда пользователь прокручивает TableView).
Я хочу сделать абсолютно гладкую прокрутку, которая не зависит от загрузки/обработки данных.
Что было сделано неправильно и что еще можно сделать здесь? Например, если я уменьшаю количество операций в обработчике, это должно улучшить отзывчивость ... может быть, так. Однако я не вижу тяжелых и ресурсоемких инструкций.
UPDATE
Я переписал свой код, используя ListView вместо TableLayout, так как бывший значительно быстрее (как оказалось, я не знаю, что). Но у меня все еще есть всплески, когда обработка XML и прокрутка ListView идут одновременно. Я сделал 2 эксперимента:
1) Я удалил все фоновые процессы - новые строки были добавлены в ListView при прокрутке вниз, но данные данные не обрабатывались для этих строк (поэтому они оставались пустыми) - такой вариант работал отлично, ни одного шипа , UI абсолютно отзывчивый.
2) Второй эксперимент состоял в том, чтобы удалить вызовы в обновлениях ListView (файл XML был обработан, но обнаруженные данные не были переданы в адаптер ListView) - на этот раз у меня были всплески. Поэтому я считаю, что эти всплески обусловлены фоновыми потоками и не связаны с вызовами обновления интерфейса пользователя. Как фоновый поток замедляет мое приложение, если я делаю их более низким приоритетом, чем приоритет основного?
Является
Thread.currentThread().setPriority(some_int);
правильный способ установить приоритет потока?
Профилируйте свой код и посмотрите, что именно вызывает отставание. Взгляните: http://developer.android.com/guide/developing/debugging/debugging-tracing.html – Ash