Reciclaje Bitmap no libera memoria

Tengo una Activity en un TabHost con 3 otras actividades. Por lo tanto, estos están siempre vivos (o en el estado "en pausa").

La primera actividad tiene cuatro imágenes diferentes (~ 250kb cada uno) y están recuperando una gran cantidad de memoria (alrededor de 80MB.) Sólo para señalar, carga el tamaño mínimo necesario para la pantalla y estoy usando layout_weight si eso ayuda), por lo que Quiero minimizar la cantidad de memoria que se necesita.

Ya intenté borrar las imágenes en el estado OnPause y las OnPause poner en OnResume , pero no tuve suerte, este es un ejemplo de lo que intentaba hacer:

  imageView.Drawable.Callback = null; ((BitmapDrawable)imageView.Drawable).Bitmap.Recycle(); imageView.Drawable.Dispose(); imageView.SetImageDrawable(null); imageView.SetImageBitmap(null); GC.Collect(); 

No sé si la eliminación del Bitmap en OnPause es la mejor estrategia, pero debería funcionar. No entiendo por qué el ImageView no es recogido por el GC (ya que no hay referencias externas)

EDITAR Así es como estoy cargando las imágenes. No funciona aunque pongo las imágenes en el archivo xml. Además, no me importa este código, sólo quiero disponer de los mapas de bits.

  void SetBackgroundImages(int imageId, int resId, float width, float height) { var imageView = FindViewById<ImageView>(imageId); using (var bitmap = DecodeSampledBitmapFromResource(Resources, resId, width, height)) imageView.SetImageBitmap(bitmap); } public static Bitmap DecodeSampledBitmapFromResource(Resources res, int resId, float reqWidth, float reqHeight) { var options = new BitmapFactory.Options {InJustDecodeBounds = true}; using (var b = BitmapFactory.DecodeResource(res,resId,options)){} options.InSampleSize = CalculateInSampleSize(options, reqWidth, reqHeight); options.InJustDecodeBounds = false; return BitmapFactory.DecodeResource(res, resId, options); } 

Al final llamando a java.lang.System.gc() después de eliminar las imágenes hizo el truco.

 using (var imageView = FindViewById<ImageView>(Resource.Id.imageView1)) using (var bitmap = Android.Graphics.BitmapFactory.DecodeResource( this.Resources, Resource.Drawable.Icon)) imageView.SetImageBitmap(bitmap); 

Vi este enfoque en varios lugares, otro es el uso de WeakReference a ImageView. Estos enfoques pueden ayudar a GC a recopilar la referencia a ImageView correctamente

  • Tablas de la barra de acción de Android, Styling el icono y el texto juntos
  • System.ObjectModel Advertencia Xamarin no se ejecuta en Android
  • MonoDroid GetSpans último parámetro
  • Cómo cerrar la actividad de Android con visual studio y xamarin
  • No se pudo iniciar la aplicación.
  • Cómo detener un proceso de System.Diagnostics.Process y obtener las estadísticas al final
  • Uso del depurador de Microsoft con Xamarin Android
  • Cómo obtener errores al ejecutar la aplicación xamarin.android
  • Monodroid Google Maps v2 - La tarea "LinkAssemblies" falló inesperadamente
  • Mono.Data.Sqlite.SqliteConnection.SetConfig lanza una biblioteca utilizada incorrectamente excepción
  • Diseño que no muestra contenido cuando se carga a través de una nueva actividad en Xamarin
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.