Подтвердить что ты не робот

Окно курсора: окно заполнено

Я создал ListView, заполненный данными, возвращаемыми из запроса.
Он работает, но в LogCat у меня есть сообщение:

Cursor Window: Window is full: requested allocation 444 bytes, free space 363 bytes, window size 2097152 bytes

и он использует пару минут для загрузки/визуализации ListView.

Мой запрос возвращает около 3700 строк String/Int/Double, каждый из которых содержит 30 столбцов; нет изображений или отдельных типов данных

Что означает это сообщение, и как я могу его избежать?
Можете ли вы улучшить производительность, изменив это окно курсора?

4b9b3361

Ответ 1

Из моего опыта это означает, что результаты запроса слишком велики для окна курсора, и он запрашивает больше памяти. В большинстве случаев этот запрос соблюдается, но на устройствах с низким уровнем он может генерировать исключения.

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

Мой совет состоит в том, чтобы разбить запрос на несколько запросов, которые возвращают меньшие результаты и закрывают их перед запуском следующего запроса. После каждого последующего запроса объедините результаты.

Ответ 2

У меня также возникла эта проблема. В моем случае я сохранил 2,2 МБ изображения в базе данных. При загрузке данных из базы данных с помощью Cursor.getBlob() я увижу это сообщение в журнале:

CursorWindow: Window is full: requested allocation 2202504 bytes, free space 2076560 bytes, window size 2097152 bytes

После получения этого сообщения, если я попытаюсь получить любые данные (String, number и т.д.) для последующих строк, он будет возвращен как null без каких-либо ошибок. Решение состояло в том, чтобы удалить кадр 2.2 MB. Я не знаю, можно ли загружать большие капли из базы данных в Android.