Android: использование многопоточности для обеспечения адаптивного интерфейса (архивная плавная прокрутка) - PullRequest
1 голос
/ 25 января 2012

Моя деятельность заключается в загрузке и отображении объявлений (из веб-службы объявлений). Чтобы пользовательский интерфейс реагировал, я выполняю следующие действия в фоновых потоках:

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);

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

Ответы [ 2 ]

0 голосов
/ 25 января 2012

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

0 голосов
/ 25 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...