LruCache no funciona

final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int cacheSize = maxMemory / 8; mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { // The cache size will be measured in kilobytes rather than // number of items. return bitmap.getByteCount() / 1024; } }; URL url = new URL("http://s2.goodfon.ru/image/260463-1920x1200.jpg"); Bitmap bitmap = BitmapFactory.decodeStream((InputStream) url.getContent(), null, options); if(bitmap != null) Log.i("Success", "BITMAP IS NOT NULL"); String key = "myKey"; Log.i("Get is null", "putting myKey"); mMemoryCache.put(key, bitmap); Bitmap newBitmap = mMemoryCache.get(key); if(newBitmap == null) Log.i("newBitmap", "is null"); 

Hola, aquí hay un código. Consigo el bitmap de la URL con éxito (el registro dice que el mapa de bits no es nulo y puedo exhibirlo fácil). Entonces estoy intentando ponerlo en LruCache y conseguirlo detrás, pero devuelve null. (El registro dice que newBitmap es nulo). ¿Dónde está mi error? Por favor dime. Android 4.1.2 Tamaño de caché 8192 Kb.

Si es de 1,19 MB en el disco pero ~ 9 MB en la memoria, eso significa que como un archivo JPEG comprimido, es 1,19 MB y una vez que se extrae en un mapa de bits (descomprimido) que se puede mostrar, tomará 9 MB en la memoria . Si se trata de una imagen de 1920 x 1200 píxeles, tal como sugiere la url del fragmento de código, la imagen ocupará 1920 x 1200 x 4 bytes de memoria (4 bytes por cada píxel para representar los valores de ARGB de 0 a 256 veces 2,3 millones de píxeles totales = 9,216,000 bytes). Si está utilizando 1/8 de su memoria disponible para esta caché, es posible que 9MB supere ese espacio total de memoria, de modo que el mapa de bits nunca llegue a la memoria caché o sea desalojado inmediatamente.

Probablemente va a querer descifrar la imagen en el tiempo de decodificación si es tan grande (utilizando BitmapFactory.Options.inSampleSize … hay mucha documentación en la web para usarla si no está familiarizado).

Además, está utilizando Runtime.maxMemory para calcular su tamaño de caché. Esto significa que está solicitando la cantidad máxima de memoria que toda la VM está autorizada a utilizar.

http://developer.android.com/reference/java/lang/Runtime.html#maxMemory%28%29

El enfoque más común es el uso del valor dado de nuevo a usted por el método ActivityManager.getMemoryClass ().

Aquí hay un fragmento de código de ejemplo y la definición del método en los documentos para referencia.

  ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); int memClassBytes = am.getMemoryClass() * 1024 * 1024; int cacheSize = memClassBytes / 8; mMemoryCache = new LruCache<String, Bitmap>(cacheSize) 

http://developer.android.com/reference/android/app/ActivityManager.html#getMemoryClass%28%29

También puede reciclar mapas de bits que salen de lrucache

 final Bitmap bmp = mLruCache.put(key, data); if (bmp != null) bmp.recycle(); 

El ejemplo de Android estuvo equivocado al dividir Runtime maxMemory por 1024 en la siguiente línea:

 final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); 

La unidad de maxMemory es Byte, que es lo mismo con el 'cacheSize' ('/ 8' sólo significa que usará octavo de la memoria disponible de la Actividad actual). Por lo tanto, '/ 1024' hará que el 'cacheSize' sea extremadamente pequeño de tal manera que ningún mapa de bits pueda ser realmente 'caché' en 'mMemoryCache'.

La solución será borrar '/ 1024' en el código anterior.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.