Cómo obtener fugas de memoria al cargar imágenes de URl Android
Actualmente estoy usando Xamarin. para desarrollar mi aplicación Android el problema que tengo es cuando carga un montón de imágenes que se necesita un gran pedazo de mi memoria de la pila y no se restablece correctamente. Así que si la aplicación comienza en la Actividad A y va a la Actividad B (carga las imágenes) vuelvo a la Actividad A y regreso a B se bloquea (problema de memoria). He subido una aplicación de demostración que demuestra el problema que estoy experimentando.
namespace imageLoader { [Activity (Label = "LoadImages")] public class LoadImages : Activity { Bitmap image; List<PromotionClass> pro; PromotionAdapter proAdapter; RadListView radlist; protected override void OnCreate (Bundle bundle) { base.OnCreate (bundle); SetContentView (Resource.Layout.LoadImages); LinearLayout line = (LinearLayout)FindViewById (Resource.Id.lin); radlist = new RadListView (this); GridLayoutManager gridLayoutManager = new GridLayoutManager(this,1, LinearLayoutManager.Horizontal, false); radlist.SetLayoutManager (gridLayoutManager); pro = new List<PromotionClass>(); ArrayList a = new ArrayList (); a.Add ("http://apk.payment24.co.za/promotions/nov/Zappar.jpg"); a.Add ("http://apk.payment24.co.za/promotions/nov/Valpre.jpg"); a.Add ("http://apk.payment24.co.za/promotions/nov/Tropika.jpg"); int dent = (int)Resources.DisplayMetrics.Density; foreach (var url in a) { image = GlobalMethods.GetImageBitmapFromUrl(url.ToString(),dent); pro.Add(new PromotionClass("","",image)); } proAdapter = new PromotionAdapter (pro, this); radlist.SetAdapter (proAdapter); line.AddView (radlist); // Create your application here } public override void OnBackPressed () { SetContentView (Resource.Layout.Main); Intent intent = new Intent (this, typeof(LoadImages)); intent.AddFlags (ActivityFlags.NewTask); intent.AddFlags (ActivityFlags.ClearTask); intent.AddFlags (ActivityFlags.NoAnimation); StartActivity (intent); this.Finish (); } }
}
- Xamarin iOS localización utilizando .NET
- Xamarin: BroadcastReceiver no recibe cuando la aplicación no se está ejecutando
- Quitar icono de la barra de acción xamarin
- ¿Qué es EGL y GL mtrack en Android Memory Dump
- ¿Por qué no puedo acceder al punto de interrupción cuando empiezo a depurar la aplicación Android de Xamarin?
public static Bitmap GetImageBitmapFromUrl(string url,int dens) { Bitmap bitmapScaled = null; using (var webClient = new WebClient()) { var imageBytes = webClient.DownloadData(url); if (imageBytes != null && imageBytes.Length > 0) { // Create an image from the Byte Array Bitmap imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length); bitmapScaled = Bitmap.CreateScaledBitmap(imageBitmap, imageBitmap.Height * dens, imageBitmap.Width * dens, true); imageBitmap.Recycle(); } } // Return the new Scaled image return bitmapScaled; }
Google Drive
también contiene archivos dll telerik.
- Async / esperar malas prácticas bajo Android?
- Actualización de Xamarin hace que "el archivo de clase tenga versión incorrecta 52.0, debe ser 50.0" error
- Cómo probar todo en Xamarin
- Xamarin.Android: ¿Cómo capturar eventos Button definidos en el atributo OnClick XML?
- Microsoft OData Client Xamarin no funciona
- ¿Cómo uso SharedPreferences en Xamarin.Android?
- Xamarin y código c ++
- Manejo de URL específicas con filtros de intenciones en Xamarin Mono para Android
De mirar los fragmentos de código que pegó aquí, otra cuestión podría ser que el "List ()" cada uno mantener una referencia a la "escala" de imagen – pero estos nunca parecen ser liberados / reciclado.
¿Has intentado hacer esencialmente PromotionClass desechable? A continuación, dentro del "OnDestroy ()" método de la actividad de Android, puede Dispose la "PromotionClass" 's que a su vez puede reciclar / disponer de las imágenes a escala reducida.
Almacenar mapa de bits cargado en caché, por lo que no es necesario volver a cargar el mapa de bits.
Consulte https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
- ClassCastException: android.widget.LinearLayout $ LayoutParams no se puede convertir en com.android.internal.widget.ActionBarOverlayLayout $ LayoutParams
- Android 5.0+ oculta "solicitud de sincronización Bluetooth" del usuario en el área de notificación