Error de memoria de mapa de bits – Android

Estoy teniendo una pérdida de memoria en mi aplicación que está provocando GC un número de veces y causar problemas de rendimiento. He generado un leak suspect report utilizando MAT . Aquí está el informe:

Problema Suspect 1: Una instancia de "android.graphics.Bitmap" cargado por "" ocupa 4,194,368 (20,13%) bytes. La memoria se acumula en una instancia de "byte []" cargado por "".

Problema Suspeito 2: La clase "android.content.res.Resources", cargada por "", ocupa 3,962,504 (19,02%) bytes. La memoria se acumula en una instancia de "java.lang.Object []" cargado por "".

Problema Suspect 3: Una instancia de "android.graphics.Bitmap" cargado por "" ocupa 3.145.792 (15.10%) bytes. La memoria se acumula en una instancia de "byte []" cargado por "".

A juzgar por los informes de su evidente que la pérdida de memoria es debido a mapa de bits. He investigado mucho pero no pude corregir esta filtración. Por favor, ayúdame. Estoy usando la clase ImageLoader para descargar y mostrar mapas de bits. Para usar esta clase simplemente llamo el método displayImage() . Aquí está el código:

 public class ImageLoader { private static ImageLoader imageLoader; private int maxNoOfConnections = 4; FileCache fileCache; ExecutorService executorService; HttpURLConnection conn; InputStream is; OutputStream os; PhotosLoader photosLoader; Handler handler; Bitmap bitmap; private ImageLoader(Context context) { fileCache = new FileCache(context); executorService = Executors.newFixedThreadPool(maxNoOfConnections); handler = new Handler(); } public static ImageLoader getInstance(Context context) { if (imageLoader == null) imageLoader = new ImageLoader(context); return imageLoader; } public void displayImage(String url, ProgressBar pBar, ImageView imageView) { photosLoader = new PhotosLoader(url, imageView, pBar); executorService.submit(photosLoader); } private Bitmap getBitmap(String url) { File f = fileCache.getFile(url); bitmap = decodeFile(f); if (bitmap != null) return bitmap; try { URL imageUrl = new URL(url); conn = (HttpURLConnection) imageUrl.openConnection(); conn.setConnectTimeout(30000); conn.setReadTimeout(30000); conn.setInstanceFollowRedirects(true); is = conn.getInputStream(); os = new FileOutputStream(f); Utils.CopyStream(is, os); os.close(); bitmap = decodeFile(f); return bitmap; } catch (Exception ex) { Log.e("inNews", "Image Url Malformed"); return null; } } private Bitmap decodeFile(File f) { try { BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(new FileInputStream(f), null, o); final int REQUIRED_SIZE = 70; int width_tmp = o.outWidth, height_tmp = o.outHeight; int scale = 1; while (true) { if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) break; width_tmp /= 2; height_tmp /= 2; scale *= 2; } BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); } catch (FileNotFoundException e) { } return null; } class PhotosLoader implements Runnable { String url; ImageView imageView; ProgressBar pBar; Bitmap bmp; public PhotosLoader(String url, ImageView imageView, ProgressBar pBar) { this.url = url; this.imageView = imageView; this.pBar = pBar; } @Override public void run() { bmp = getBitmap(url); handler.post(new Runnable() { @Override public void run() { if (bmp != null) { pBar.setVisibility(View.GONE); imageView.setImageBitmap(bmp); } else { pBar.setVisibility(View.GONE); imageView.setImageResource(R.drawable.img_no_image_grid); } } }); } } } 

Por favor, ayúdame a rectificar mi código. ¡Gracias!

Nota: No he utilizado bitmap.recycle() ya que, la documentación dice que post-Honeycomb el GC recoge bitmaps y ya no es necesario para reciclarlo con fuerza!

Problema de pérdida de memoria siempre los problemas de Java. Entiendo su código, código simple herramienta imagecache. Compruebe el valor SampleSize y el servicio ejecutor ejecutado en un solo hilo. Cuatro hilos tienen gran memoria y esta acción de hilo de fondo. Su "manejador" de intercambio a "runOnUIThread"

Deberías usar;

Actividad activity = (Actividad) imageView.getContext ();

 __activity__.runOnUIThread(new Runnable() { if (bmp != null) { pBar.setVisibility(View.GONE); imageView.setImageBitmap(bmp); } else { pBar.setVisibility(View.GONE); imageView.setImageResource(R.drawable.img_no_image_grid); } }); 

Creo que el problema es la instancia de Singleton … Hice una bifurcación del proyecto LazyList, compruebe esto:

https://github.com/nicolasjafelle/LazyList

Tengo el mismo Memory Leak pero, y tal vez estoy equivocado, este singleton nunca será recolectado de basura a menos que matar el proceso con System.exit ().

Es por eso que el proyecto LazyList original no utiliza Singleton. También creo que si necesita una caché tendrá que ser rápido y lo mismo para toda la aplicación.

Lo importante en este ImageLoader es el FileCache y MemoryCache, cuando se llama a clearCache los mapas de bits donde se recopilan.

Pienso que la respuesta es simple, apenas subsistencia que limpia la memoria caché cuando usted no necesita memoria / cuando surge la excepción de OOM. Hice eso por ti

 MemoryCache memoryCache = new MemoryCache(); try { Bitmap bitmap = null; URL imageUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) imageUrl .openConnection(); conn.setConnectTimeout(30000); conn.setReadTimeout(30000); conn.setInstanceFollowRedirects(true); InputStream is = conn.getInputStream(); OutputStream os = new FileOutputStream(f); Utils.CopyStream(is, os); os.close(); conn.disconnect(); bitmap = decodeFile(f); return bitmap; } catch (Throwable ex) { ex.printStackTrace(); if (ex instanceof OutOfMemoryError) memoryCache.clear(); return null; } 
  • Sqlite base de datos FUGA ENCONTRADA excepción en android?
  • Admob Memory Leak - evitando usar la actividad vacía
  • Cómo corregir un "SQLiteConnection para la base de datos gms" que se filtró
  • Pérdida de memoria con imágenes
  • Esta clase Handler debe ser estática o pueden producirse fugas: handler final
  • ¿El aumento de tamaño de jittable se correlaciona con la pérdida de memoria en android?
  • ¿Cómo puedo solucionar esta pérdida de memoria de Android que involucra Threads?
  • Seguimiento de la memoria / fugas de la ventana en Android?
  • ¿Qué herramientas y métodos de Android funcionan mejor para detectar fugas de memoria / recursos?
  • Las imágenes agregadas a AnimationDrawable por programación memoria de fugas
  • Fuga de AdActivity en AdMob (SDK 7.0) para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.