Note that there are some explanatory texts on larger screens.

plurals
  1. POWhen should I recycle a bitmap using LRUCache?
    primarykey
    data
    text
    <p>I'm using an <code>LRUCache</code> to cache bitmaps which are stored on the file system. I built the cache based on the examples here: <a href="http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html" rel="noreferrer">http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html</a></p> <p>The problem is that I'm seeing OutOfMemory crashes frequently while using the app. I believe that when the LRUCache evicts an image to make room for another one, the memory is not being freed.</p> <p>I added a call to Bitmap.recycle() when an image is evicted:</p> <pre><code> // use 1/8 of the available memory for this memory cache final int cacheSize = 1024 * 1024 * memClass / 8; mImageCache = new LruCache&lt;String, Bitmap&gt;(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; } }; </code></pre> <p>This fixes the crashes, however it also results in images <em>sometimes</em> not appearing in the app (just a black space where the image should be). Any time that occurs I see this message in my Logcat: <code>Cannot generate texture from bitmap</code>.</p> <p>A quick google search reveals that this is happening because the image which is displaying has been recycled.</p> <p>So what is happening here? Why are recycled images still in the LRUCache if I'm only recycling them after they've been removed? What is the alternative for implementing a cache? The Android docs clearly state that LRUCache is the way to go, but they do not mention the need to recycle bitmaps or how to do so.</p> <p><strong>RESOLVED:</strong> In case its useful to anyone else, the solution to this problem as suggested by the accepted answer is to <em>NOT</em> do what I did in the code example above (don't recycle the bitmaps in the <code>entryRemoved()</code> call).</p> <p>Instead, when you're finished with an ImageView (such as <code>onPause()</code> in an activity, or when a view is recycled in an adapter) check if the bitmap is still in the cache (I added a <code>isImageInCache()</code> method to my cache class) and, if it's not, then recycle the bitmap. Otherwise, leave it alone. This fixed my <code>OutOfMemory</code> exceptions and prevented recycling bitmaps which were still being used.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload