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.
- Cómo cambiar los colores de la forma en Drawable?
- No encontró la clase "mono.android.app.Application"
- .axml destacando y la inteligencia no funciona en monodroid
- Cambiar el color de ActionBar - Xamarin
- Eliminar listview en xamarin android
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); }
- Xamarin Archivo de recursos Android no encontrado
- No se pueden analizar los datos xml a listview en xamarin android
- Enlace Xamarin.Android definiendo Getter / Setter Métodos usando EnumMethods.xml para la interfaz
- Xamarin construir acción de advertencia XA0101
- Xamarin Android con multidex - error en modo de depuración
- Xamarin Forms - Media Plugin - Vaciar las miniaturas en el teléfono
- Instalar GooglePlayServices con NuGet me da un error de Install-Package
- Xamarin FindViewById devuelve null
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
- ¿El cursor permanecerá vivo después de cerrar la base de datos?
- ¿Por qué Android recicla el tipo de vista incorrecto en mi SpinnerAdapter?