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.
- ¿Es posible especificar dinámicamente el nombre del paquete durante la compilación?
- ¿Cómo usar la Facturación en la aplicación con MonoDroid?
- Xamarin Forms PCL HttpClient lanzando una excepción no controlada en Android
- Depuración de un dispositivo "remoto" Android con Xamarin?
- En XNA a Mono Android Conversiones: ¿Qué es una manera simple (o la más simple) de manejar el ciclo de vida de la actividad?
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); }
- Archivado tamaño de archivo APK muy grande - Xamarin.Android
- Instalación de Xamarin Mono para Android
- Estoy tratando de hacer mono android simple "hola mundo", pero no veo "hola mundo" en el emulador por qué?
- Actualización de Xamarin hace que "el archivo de clase tenga versión incorrecta 52.0, debe ser 50.0" error
- Cómo crear un DialogFragment personalizado al 100%
- Fondo circular de ProgressBar: Android Xamarin
- ¿Qué tema utiliza el diseñador de Xamarin para Mono para Android?
- Mono para macros de preprocesador de Android
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?