从URl Android加载图像时出现内存泄漏

时间:2015-08-28 05:29:45

标签: android memory-leaks xamarin

我目前正在使用Xamarin。开发我的Android应用程序 我遇到的问题是,当我加载一堆图像时,它需要一大堆我的堆栈内存并且不能正常重置。因此,如果应用程序从活动A开始,然后转到活动B(加载图像),我将返回活动A并返回到B崩溃(内存不足问题)。我上传了一个演示应用程序,演示了我遇到的问题。

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文件。

2 个答案:

答案 0 :(得分:0)

将加载的位图存储到缓存中,因此无需重新加载位图 请参阅https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

答案 1 :(得分:0)

通过查看您在此处粘贴的代码段,另一个问题可能是&#34; List()&#34;每个人都提到&#34;缩放&#34;图像 - 但这些似乎永远不会被释放/回收。

您是否尝试过使用PromotionClass一次性?然后在&#34; OnDestroy()&#34;在android活动的方法中,您可以设置&#34; PromotionClass&#34;然后可以回收/处理缩小的图像。