2013-11-20 62 views
20

我創建了一個由查詢返回的數據填充的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列;沒有圖像或特定數據類型

這條消息究竟意味着什麼,我該如何避免它?
您可以通過更改此光標窗口來提高性能嗎?

+2

請參閱此:http://stackoverflow.com/questions/11863024/android-cursor-window-is-full –

+0

謝謝,但我已經看到了這個問題,我不能使用SD卡 – Tirrel

+0

任何更新這個?在某些情況下,我在字符串列表中遇到了同樣的問題。 –

回答

14

根據我的經驗,這意味着查詢結果對於光標的窗口來說太大,並且它會請求更多的內存。大多數情況下,這個請求都很有用,但是在低端設備上它可能會引發異常。

我不知道有問題的應用程序的細節,但你提到一個ListView。 ListView不能一次顯示3700行,並且endless list可以幫助按需加載數據

我的建議是將查詢分解爲多個查詢,以返回較小的結果並在運行下一個查詢之前關閉它們。每個連續的查詢合併結果後。

+0

一個ListView可以顯示一個超過10 000行的遊標(基於我自己的經驗)。這個問題無疑是關於記憶,而不是行數。 – matreshkin

+0

@matreshkin同意,這是一個ListView的整個點:根據屏幕上可見的內容來延遲加載和渲染行。 –

+1

順便說一句,現在我看到@Delblanco寫道「一個ListView不能顯示3700行AT ONCE」。聽起來令人困惑,但實際上3700視圖附屬於窗口似乎是非同尋常的情況:) – matreshkin

1

我也有這個問題。在我的情況下,我在數據庫中保存了一張2.2 MB的圖像。當加載使用Cursor.getBlob()數據庫中的數據我會在日誌中看到這樣一條消息:

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

,如果我嘗試檢索連續行的任何數據(字符串,數字等),我會得到這個消息後,它返回爲null沒有任何錯誤。 解決方案是刪除2.2 MB的blob。我不知道是否可以在Android中從數據庫加載更大的Blob。