2015-08-28 2 views
4

В настоящее время я использую Xamarin. для разработки моего приложения Android проблема, с которой я столкнулась, - это когда я загружаю кучу изображений, она занимает большую часть моей памяти стека и не сбрасывается должным образом. Поэтому, если приложение запускается в Activity A, и вы переходите на Activity B (загружает его изображения), я возвращаюсь к Activity A и возвращаюсь обратно в B, он падает (из памяти). Я загрузил демонстрационное приложение, демонстрирующее проблему, которую я испытываю.Получение утечек памяти при загрузке изображений с URl Android

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

}

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

он также содержит Telerik DLL файлы.

+0

Я добавил код –

+0

Я бы просто использовал UrlImageViewHelper, чтобы обрабатывать все это для вас: https://components.xamarin.com/view/urlimageviewhelper Это потрясающая библиотека. Или посмотрите на picasso: https://components.xamarin.com/view/square.picasso – JamesMontemagno

ответ

0

Глядя на фрагменты кода, которые Вы вставили здесь, еще один другой вопрос, может быть, что «List()» каждый содержит ссылку на «масштабируется» образ - но они никогда, кажется, быть освобожден/переработаны.

Вы пробовали по существу сделать одноразовое предложение PromotionClass? Затем в методе «OnDestroy()» активности андроида вы можете удалить «PromotionClass», который, в свою очередь, может перерабатывать/удалять уменьшенные изображения.