Androide. Problemas de OutOfMemory

Necesito mostrar muchas imágenes en mi aplicación. Estos son jpgs y pngs y los estoy cargando dentro de ImageViews así:

tile.setImageResource(R.drawable.tile_highlight); 

Actualmente tengo problemas con OutOfMemory ( java.lang.OutOfMemoryError: bitmap size exceeds VM budget )

He buscado y encontrado algunos otros mensajes, todos sugieren que usted debe reciclar el mapa de bits de un ImageView manualmente, así: ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle(); que lo volcará de memoria.

Pero en mi caso, siendo que no estoy usando setBitmap() para cargar las imágenes en los objetos ImageView, cuando intento ejecutar el código anterior, devuelve NullPointerException , más precisamente, el método getBitmap() devuelve null, there is no mapa de bits?!?!

¿Necesito volver en mi código y cambiar la forma en que carga todas las imágenes en ImageViews, y luego intentar con el método recycle() ? ¿O cómo puedo liberar la memoria para que no se bloquee más?

EDITAR

He intentado algo así: imageView.setImageResource(-1); con la esperanza de que quitará la imagen de la memoria y la reemplazará con … null o algo así, pero parece que no ayuda a la causa.

Sería útil que pudiera publicar parte de su código. En concreto, cómo está configurando las imágenes de los objetos ImageView . Si no está utilizando bitmaps, esperaría que getBitmap() devolverá null. Sin embargo, si está utilizando otro tipo de Drawable o de otra manera para establecer la imagen, es probable que una ruta similar para tomar que no implica bitmaps.

EDITAR:

Muy bien, darle una oportunidad. Puede crear un Bitmap de Bitmap desde un recurso como este:

 Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.image); 

A continuación, utilice el mapa de bits como esto, teniendo en cuenta que img es su ImageView :

 img.setImageBitmap(bm); //Do some stuff with it, then when memory gets low: ((BitmapDrawable)img.getDrawable()).getBitmap().recycle(); 

Por supuesto, esto es considerar que estás en una actividad. Si no es así, tendrás que obtener un identificador en el contexto y reemplazar getResources() con context.getResources() .

tratar

 ((BitmapDrawable)im.getBackground()).getBitmap().recycle(); 

Si desea establecer una imagen de dibujable a ImageView, no utilice ImageView.setImageResource(int resId) directamente con ID de ImageView.setImageResource(int resId) . En su lugar, obtenga un mapa de bits de escala reducida (si procede) y establezca en imageView. así: esto funciona para mí.

  iv.setImageBitmap(decodeResource(getResources(), R.drawable.big_image)); private static Bitmap decodeResource(Resources res, int id) { Bitmap bitmap = null; BitmapFactory.Options options = new BitmapFactory.Options(); for (options.inSampleSize = 1; options.inSampleSize <= 32; options.inSampleSize++) { try { bitmap = BitmapFactory.decodeResource(res, id, options); Log.d(TAG_LOG, "Decoded successfully for sampleSize " + options.inSampleSize); break; } catch (OutOfMemoryError outOfMemoryError) { // If an OutOfMemoryError occurred, we continue with for loop and next inSampleSize value Log.e(TAG_LOG, "outOfMemoryError while reading file for sampleSize " + options.inSampleSize + " retrying with higher value"); } } return bitmap; } 

fuente: https://codingjunkiesforum.wordpress.com/2014/06/12/outofmemory-due-to-large-bitmap-handling-in-android/

Creo que debería mostrar imágenes con menor resolución. Esto resolvería el problema de MOO. También puedes leer el enlace Guía de desarrolladores de Android

El error de OutOfMemory viene cuando usted no libera el mapa de bits una vez que está siendo utilizado (puede ser de gran tamaño) así que para prevenir esto debemos tener presente de volver a clasificar, teniendo weakreferences etc. pero hay buenas bibliotecas disponibles que está tomando el cuidado todo el problema uno de ellos son Picasso. por favor, eche un vistazo a-

cargando imágenes usando Picasso

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