2013-11-20 29 views
20

Bir sorgudan döndürülen veri tarafından doldurulan bir ListView oluşturdum. Bu, ancak inşaat LogCat ben mesajı aldım
:İmleç penceresi: pencere dolu

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

ve ListView görselleştirme/yükleme için birkaç dakika kullanır.

Sorgum, her biri 30 sütun içeren yaklaşık 3700 Dize/Int/Double satırını döndürür; Görüntü veya kasıtsız görüntü yok

Bu mesaj tam olarak ne anlama geliyor ve nasıl önleyebilirim?
Bu İmleç Penceresini değiştirerek performansları geliştirir misiniz?

+2

Şunlara bakın: http://stackoverflow.com/questions/11863024/android-cursor-window-is-full –

+0

Teşekkürler ama bu soruyu zaten görmüştüm ve SD Kart – Tirrel

+0

hiçbir güncellemeyi kullanamıyorum Bu? Aynı problemi belirli durumlarda dizgiler listesine alıyorum. –

cevap

14

Deneyimlerimden bu, sorgu sonuçlarının imlecin penceresi için çok büyük olduğu ve daha fazla bellek istediği anlamına gelir. Çoğu zaman bu istek onurlandırılır, ancak düşük son cihazlarda istisnalar atabilir.

Söz konusu uygulamanın özelliklerini bilmiyorum, ancak bir ListView'e yönlendirildiniz. Bir ListView bir kerede 3700 satır gösteremez ve endless list istek üzerine veri yüklemek için yardımcı olabilir

Benim önerim, sorguyu küçük sonuçları döndüren ve sonraki sorguyu çalıştırmadan önce kapatan birden çok sorguda ayırmaktır. Her ardışık sorgudan sonra sonuçları birleştirin.

+0

A ListView, imleci 10 000'den fazla satırı (kendi deneyimlerime dayanarak) gösterebilir. Hırsız meselesi hafızayla ilgili değil, satır sayısıyla ilgili. – matreshkin

+0

@matreshkin katılıyorum, ListView'ın tüm noktası budur: Satırları ekranda görünenlere göre temellendirmek ve render etmek. –

+1

BTW, şimdi görüyorum ki @Delblanco "A ListView AT ONCE 3700 satır gösteremez" yazdı. Kulağa kafa karıştırıcı geliyor ama aslında bir pencereye bağlı 3700 Görünüm olağanüstü bir durum gibi görünüyor :) – matreshkin

1

Bu sorunu da çözdüm. Benim durumumda veritabanında 2.2 MB bir görüntü kaydettim. Cursor.getBlob() kullanarak veritabanından veri yüklerken ben Günlüğü'nde bu mesajı görecekti:

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

ben arda satırlar için herhangi bir veri (String, sayı vb) almak için çalışırsanız bu mesajı alacağı sonra herhangi bir hata olmadan null olarak döndürülür. Çözüm 2.2 MB blob kaldırmak için oldu. Android'de veritabanından daha büyük blobları yüklemek mümkün olup olmadığını bilmiyorum.