2012-01-25 2 views
1

Моя активность - загрузить и отобразить объявления (с веб-сервиса объявлений). Для того, чтобы сохранить пользовательский интерфейс отзывчивый я следующие действия в фоновых потоков: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); 

правильный способ установить приоритет потока?

+0

Профилируйте свой код и посмотрите, что именно вызывает отставание. Взгляните: http://developer.android.com/guide/developing/debugging/debugging-tracing.html – Ash

ответ

0

В какой-то момент поток пользовательского интерфейса должен добавить эти новые объекты, создать новые объекты пользовательского интерфейса в памяти и добавить их в список ничьей. Что вы могли бы попробовать - предварительно выделить столько памяти, сколько вам нужно, создав много невидимых строк таблиц в пользовательском интерфейсе. Это может решить некоторые проблемы, так как потенциально поток пользовательского интерфейса пытается перераспределить его память, чтобы освободить место для ваших новых TableRows.

Кроме того, вы можете попробовать использовать Thread.yield(), в ваших фоновых потоках. Это сообщает операционной системе Android, что этот поток готов, и при необходимости позволяет возобновить поток пользовательского интерфейса (если поток пользовательского интерфейса простаивает, он возобновляется мгновенно).

-1

Если вы не выполняете ввода-вывода в потоке пользовательского интерфейса, то описанные вами задержки, вероятно, являются макетами. Предложите вам сосредоточиться на оптимизации макета. Есть ли причина, по которой вы не используете ListView?