Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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); } 

  • Cómo eliminar la flecha HomeAsUpButton de ActionBar Sherlock?
  • Error después de habilitar Multi-Dex en Xamarin Android
  • F # en Mono para Android
  • Símbolo no encontrado en OnActionExpandListener
  • Necesito un ejemplo de sqlite con Monodroid
  • Programe la notificación usando el administrador de alarmas en formularios xamarin para android
  • Los atributos personalizados de monodroid / xamarin están vacíos usando ObtainStyledAttributes
  • Mono para Android - Arquitectura soportada - Drop x86?
  • 2 Solutions collect form web for “Reciclaje Bitmap no libera memoria”

    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

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