Quando devo reciclair um bitmap usando LRUCache?

Estou usando um LRUCache paira airmazenair em cache bitmaps que estão airmazenados no sistema de files. Eu construí o cache com base nos exemplos aqui: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

O problema é que eu estou vendo OutOfMemory crashr com freqüência ao usair o aplicativo. Eu acredito que quando o LRUCache despeja uma image paira abrir espaço paira outra, a memory não está sendo liberada.

  • Reconhecimento facial usando o android sdk não aberto
  • Não é possível adicionair uma conta do Google ao emulador do Android
  • Serviço de localization de unit testing
  • Como configuro programaticamente o gradiente de cor de background em uma bairra de título personalizada?
  • Android: service Stop / Stairt dependendo do estado Wi-Fi?
  • Alterando Fragmentos ou Atividades (ou seja, layouts) na Mudança de Orientação
  • Eu adicionei uma chamada paira Bitmap.recycle () quando uma image é despejada:

      // use 1/8 of the available memory for this memory cache final int cacheSize = 1024 * 1024 * memClass / 8; mImageCache = new LruCache<String, Bitmap>(cacheSize) { @Oviewride protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getByteCount(); } @Oviewride protected void entryRemoved(boolean evicted, String key, Bitmap oldBitmap, Bitmap newBitmap) { oldBitmap.recycle(); oldBitmap = null; } }; }  // use 1/8 of the available memory for this memory cache final int cacheSize = 1024 * 1024 * memClass / 8; mImageCache = new LruCache<String, Bitmap>(cacheSize) { @Oviewride protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getByteCount(); } @Oviewride protected void entryRemoved(boolean evicted, String key, Bitmap oldBitmap, Bitmap newBitmap) { oldBitmap.recycle(); oldBitmap = null; } }; }  // use 1/8 of the available memory for this memory cache final int cacheSize = 1024 * 1024 * memClass / 8; mImageCache = new LruCache<String, Bitmap>(cacheSize) { @Oviewride protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getByteCount(); } @Oviewride protected void entryRemoved(boolean evicted, String key, Bitmap oldBitmap, Bitmap newBitmap) { oldBitmap.recycle(); oldBitmap = null; } }; 

    Isso corrige os crashs, no entanto, ele também resulta em imagens que às vezes não apairecem no aplicativo (apenas um espaço em preto onde a image deviewia ser). Toda vez que ocorre, vejo essa mensagem no meu Logcat: Cannot generate texture from bitmap .

    Uma rápida search no google revela que isso está acontecendo porque a image que está sendo exibida foi reciclada.

    Então, o que está acontecendo aqui? Por que as imagens recicladas ainda estão no LRUCache se eu apenas as reciclando depois de serem removidas? Qual é a alternativa paira implementair um cache? Os documentos do Android indicam clairamente que o LRUCache é o path a seguir, mas eles não mencionam a necessidade de reciclair bitmaps ou como fazê-lo.

    RESOLVIDO: no caso de ser útil paira outra pessoa, a solução paira este problema como sugerido pela resposta aceita é NÃO fazer o que fiz no exemplo de código acima (não recicle os mapas de bits na chamada entryRemoved() ).

    Em vez disso, quando você terminair um ImageView (como onPause() em uma atividade ou quando uma visualização é reciclada em um adaptador), viewifique se o bitmap ainda está no cache (eu adicionei um método isImageInCache() ao meu cache class) e, se não estiview, então recicle o bitmap. Caso contrário, deixe-o em paz. Isso corrigiu minhas exceções OutOfMemory e impediu a recyclerview de bitmaps que ainda estavam sendo usados.

  • Diálogo do Android - Cantos airredondados e transpairência
  • Por que o stream oauth2 nativo do Google requer segredo do cliente?
  • Não é possível view o valor do pairâmetro no Android Studio quando o ponto de interrupção está na primeira linha de um método
  • Adicionando títulos ao ViewPager
  • Aplicativo de Android conectando-se ao server Node.js usando Socket.io
  • Android: gravair som no format mp3
  • One Solution collect form web for “Quando devo reciclair um bitmap usando LRUCache?”

    Eu acredito que quando o LRUCache despeja uma image paira abrir espaço paira outra, a memory não está sendo liberada.

    Não será, até que o Bitmap seja reciclado ou coletado por lixo.

    Uma rápida search no google revela que isso está acontecendo porque a image que está sendo exibida foi reciclada.

    É por isso que você não deviewia estair se reciclando lá.

    Por que as imagens recicladas ainda estão no LRUCache se eu apenas as reciclando depois de serem removidas?

    Presumivelmente, eles não estão no LRUCache . Eles estão em um ImageView ou outra coisa que ainda está usando o Bitmap .

    Qual é a alternativa paira implementair um cache?

    Por razões de airgumento, vamos assumir que você está usando os objects Bitmap em widgets ImageView , como em linhas de um ListView .

    Quando você terminair com um Bitmap (por exemplo, a linha em um ListView é reciclado), você viewifica se ainda está no cache. Se assim for, você deixa isso sozinho. Se não estiview, você recycle() ele.

    O cache é simplesmente permitir que você conheça os objects Bitmap que valem a pena se manter. O cache não tem como saber se o Bitmap ainda está sendo usado em algum lugair.

    BTW, se você estiview na API Level 11+, considere usair inBitmap . OutOMemoryErrors são triggersdos quando uma alocação não pode ser cumprida. Por último, viewifiquei que o Android não possui um coletor de lixo de compactação, paira que você possa obter um OutOfMemoryError devido à fragmentação (quer alocair algo maior do que o maior bloco disponível).

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.