SORU
24 Mayıs 2012, PERŞEMBE


Ne zaman bir bit eşlem LRUCache kullanarak geri dönüşüm gerekir?

Dosya sisteminde depolanan bit eşlem önbelleği için LRUCache Bir kullanıyorum. Ben önbellek inşa buradaki örnekler: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

Sorun Uygulamayı kullanırken sık OutOfMemory çöküyor görüyorum. Bu LRUCache başka bir yer açmak için bir resim çıkarır, bellek serbest bırakılmaz inanıyorum.

Bit Eşlem için bir telefon ekledi.bir resim tahliye olduğunda) geri dönüşüm:

  // use 1/8 of the available memory for this memory cache
    final int cacheSize = 1024 * 1024 * memClass / 8;
                mImageCache = new LruCache<String, Bitmap>(cacheSize) {
                @Override
                protected int sizeOf(String key, Bitmap bitmap) {
                    return bitmap.getByteCount();
                }

                @Override
                protected void entryRemoved(boolean evicted, String key, Bitmap oldBitmap, Bitmap newBitmap) {
                    oldBitmap.recycle();
                    oldBitmap = null;
                }
            };

Bu çöker giderir, ancak aynı zamanda görüntüler elde edilirbazenapp görünen (resim olması gereken yerde sadece siyah bir boşluk). Benim Logcat bu mesajı oluşur: Cannot generate texture from bitmap.

Hızlı bir google Arama bu görüntülüyor hangi görüntüyü geri alınmış olduğunu ortaya koymaktadır.

Burada neler oluyor? Neden sadece çıkarıldıktan sonra onları geri dönüşüm olursam hala geri dönüştürülmüş görüntüleri LRUCache? Bir önbellek uygulamak için alternatif nedir? Android docs açıkça LRUCache gitmek için bir yoldur, ama bunu yapmak için nasıl bit eşlem veya geri dönüşüm ihtiyacı söz yok bu durumu.

ARAYINIZ Başkası için yararlı durumda, kabul cevabı önerdiği gibi bu sorunun çözümü içinDEĞİLkod örneği, yaptıklarım yukarıda (entryRemoved() çağrı bit geri dönüşüm yok.

Bunun yerine, bitince bir İmageView (gibi onPause() bir faaliyet, ya da bir görünüm kazanılmış bir adaptör) kontrol ederseniz bit eşlem hala önbelleği (eklediğim bir isImageInCache() yöntem için benim önbellek sınıfı) ve, değilse, o zaman geri dönüşüm bit eşlem. Aksi halde, onu rahat bırak. Bu OutOfMemory benim özel durumlar sabit ve hala kullanılmakta olan Geri Dönüşüm bitmap engelledi.

CEVAP
25 Mayıs 2012, Cuma


Bu LRUCache başka bir yer açmak için bir resim çıkarır, bellek serbest bırakılmaz inanıyorum.

Bitmap geri dönüşüm ya da çöp toplama kadar olmayacak.

Hızlı bir google Arama bu görüntülüyor hangi görüntüyü geri alınmış olduğunu ortaya koymaktadır.

Orada geri dönüşüm olmamalı ediliyor.

Neden sadece çıkarıldıktan sonra onları geri dönüşüm olursam hala geri dönüştürülmüş görüntüleri LRUCache?

Muhtemelen, LRUCache değildir. ImageView hala Bitmap kullanan başka bir.

Bir önbellek uygulamak için alternatif nedir?

Farz edelim ImageView widget, ListView Bir satır gibi Bitmap nesneleri kullandığınız varsayılmaktadır.

Bitmap (ListView örneğin, satır geri dönüşümlü) ile işiniz bittiğinde, Eğer hala önbellekte olup olmadığını görmek için kontrol edin. Eğer o ise, onu rahat bırak. Eğer değilse, 17**.

Önbellek sadece Bitmap nesnelere tutunarak değer biliyorsun. Önbellek Bitmap hala bir yerlerde kullanılıyorsa bilmenin bir yolu vardır.

Eğer 11, inBitmap kullanmayı düşünün API varsa BTW,. OutOMemoryErrors ayırma yerine ne zaman tetiklenir. En son baktığımda, Android sıkıştırma çöp toplayıcı yok, parçalanma (büyük tek bir şey mevcut blok daha büyük tahsis etmek istiyor) nedeniyle OutOfMemoryError bir şekilde alabilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Peyton

    Peyton

    28 Aralık 2008
  • SalGames2016

    SalGames2016

    17 Kasım 2012
  • sdasmarchives

    sdasmarchive

    2 HAZİRAN 2010