【问题标题】:Getting memory leaks when loading images from URl Android从 URl Android 加载图像时出现内存泄漏
【发布时间】:2015-11-22 16:39:34
【问题描述】:

我目前正在使用 Xamarin。开发我的 android 应用程序 我遇到的问题是当我加载一堆图像时,它会占用我的堆栈内存的一大块并且无法正确重置。因此,如果应用程序在 Activity A 上启动,而您转到 Activity B(加载图像),我将返回 Activity 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 文件。

【问题讨论】:

标签: android memory-leaks xamarin


【解决方案1】:

通过查看您在此处粘贴的代码 sn-ps,另一个问题可能是“List()”每个都包含对“缩放”图像的引用 - 但这些似乎从未被释放/回收。

您是否尝试过基本上使 PromotionClass 一次性使用?然后在 android 活动的“OnDestroy()”方法中,您可以处理“PromotionClass”,它反过来可以回收/处理缩小的图像。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-01-14
      • 2016-08-10
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多