Страница 1 из 1

Загрузка ListView в отдельном потоке

Добавлено: 09 дек 2012, 21:29
maloii
У меня есть довольно таки сложный sql запрос который выполняется пару секунд, работа происходит через кастомный cursor адаптер. При открытии активити оно малость тупит, хочу чтобы пока выполняется запрос крутился прогресс бар, а активити стартовало моментально. Пробовал выполнять через AsyncTask, селект делать в doInBackground, а в адаптер его сувать в onPostExecute, но понял что тупит когда курсор делает первое смещение а это уже в потоке интерфейса. Видно это такая особенность андроида выполнять запрос по первому смещению.
Подскажите как это побороть?

Re: Загрузка ListView в отдельном потоке

Добавлено: 09 дек 2012, 21:41
rezak90
1) каждую ячейку следует грузить в отдельном потоке, дело не в листе а в адаптере, там и следует копать. но это если заведомо известно количество ячеек.
2) выгружать с бд по одной строке данных, кидать её адаптеру, обновлять и всё по новой пока не заполнится весь адаптер, конечно же это всё в отдельном потоке.

З.Ы. сомневаюсь что дело в запросе, это ж сколько там должно быть данных? 100 000 строк!?!

Re: Загрузка ListView в отдельном потоке

Добавлено: 09 дек 2012, 22:09
maloii
Данных не 100 000, где то 10 000, и сам запрос сложный, куча подзапросов, куча группировок по куче полей и всякие суммирования и т.д.. Запрос уже как мог оптимизировал, дальше некуда.
Адаптер унаследован от SimpleCursorAdapter, соответственно выгружает и собирает строки по мере прокрутке. Что то я слабо представляю как грузить ячейку в отдельном потоке :(. Так же я заметил что тупит лишь при первом сдвиге, дальше крути не хочу, выгружает быстро, видно кеширует.

Re: Загрузка ListView в отдельном потоке

Добавлено: 09 дек 2012, 22:24
rezak90
для начала засеките время в своём SQLiteOpenHelper'e до выборки курсора и после, посмотрите сколько занимает времени, посмотрим сколько будет и там уже решим что делать.

Re: Загрузка ListView в отдельном потоке

Добавлено: 09 дек 2012, 22:27
maloii
3 секунды, уже засекал.

Re: Загрузка ListView в отдельном потоке

Добавлено: 09 дек 2012, 22:46
maloii
Я кажись нашел способ, как обычно, правильная формулировка вопроса имеет в себе ответ :). Надо в doInBackground сделать moveToNext() и обратно moveToPrevious(). Тупит только на вервом moveToNext() потом видно из кеща берет.