ANR при ускоренной прокрутке listview с большими наборами данных

#android #listview #cursor

#Android #listview #курсор

Вопрос:

У меня есть Android listview с использованием адаптера SimpleCursorAdapter, и для listview включена функция быстрой прокрутки. Если у меня есть меньшие наборы данных, быстрая прокрутка работает нормально, но для больших наборов данных (более 4000 записей) при быстрой прокрутке listview это будет через ANR в * ndroid.os.BinderProxy.transact (собственный метод)

в android.database.BulkCursorProxy.GetWindow(BulkCursorNative.java:215) в android.database.BulkCursorToCursorAdaptor.onMove(BulkCursorToCursorAdaptor.java:104) в android.database.AbstractCursor.moveToPosition(AbstractCursor.java:188) в android.database.CursorWrapper.moveToPosition(CursorWrapper.java:187) в android.widget.AlphabetIndexer.getPositionForSection (AlphabetIndexer.java:202)*

а также logcat показывает * 10-19 11:40:20.664 3026 3215 D Курсор: skip_rows строка 41 10-19 11:40:20.773 3026 3215 E CursorWindow: нужно увеличить: mSize = 1048576, size = 55, FreeSpace() = 42, numRows = 2471 10-19 11:40:20.773 3026 3215 ECursorWindow: не растет, поскольку уже имеется 2471 строка (строки), максимальный размер 1048576 10-19 11:40:20.773 3026 3215 E Курсор: не удалось выделить 55 байт для текста / большого двоичного объекта в 2511,14 10-19 11:40:20.796 3026 3215 D Курсор: finish_program_and_get_row_count строка 1614 *

Я думаю, что курсор освобождает и выделяет память для больших наборов данных. это приводит к ANR

Дайте мне знать, если у вас есть какое-либо хорошее решение для решения этой проблемы, и заранее спасибо

С уважением, Сатиш

Ответ №1:

Ну, я столкнулся с подобной проблемой.Моим предложением для вас было бы создать пользовательский ArrayAdapter вместо использования CursorAdapter.Когда должен быть показан экран, извлеките записи в серверном потоке из базы данных (до этого покажите пользователю progressbar), заполните их в своем пользовательском Arrayadapter и отобразите его пользователю.Получение всех записей займет время, но база данных Android работает сравнительно медленнее, и вы мало что можете для этого сделать.Как только все объекты базы данных окажутся в памяти, ваша быстрая прокрутка будет очень быстрой, так как все будет в памяти.Я протестировал это с 30 000 записей.

——Оптимизация вашей логики для экономии памяти.——

Вместо того, чтобы создавать полный набор записей для всех элементов, сначала извлекайте первичный ключ для всех элементов и передавайте его в свой пользовательский ArrayAdapter. Переопределите метод getViews и в нем извлеките запись для этого конкретного идентификатора.Вы можете обнулить элементы, которые не видны.Таким образом, в памяти будут находиться только видимые записи элементов от 6 до 8. Дайте мне знать, если у вас есть дополнительные запросы по реализации этого.