Окно курсора: окно заполнено
Я создал 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 столбцов; нет изображений или отдельных типов данных
Что означает это сообщение, и как я могу его избежать?
Можете ли вы улучшить производительность, изменив это окно курсора?
Ответы
Ответ 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.