带有viewpager的ViewPager内存释放内存真的很晚,导致outofmemory

时间:2015-05-30 19:36:25

标签: android memory xamarin android-viewpager

我有一个由FragmentStatePagerAdapter管理的ViewPager。在此viewpager的片段内,还有另一个使用PagerAdapter(名为GalleryAdapter)的viewpager。这个" GalleryAdapter"返回图像视图。

我不知道该怎么做。滚动时位图的内存会被释放,但实际上发生得很晚,我在一台设备上进行测试,分配的内存在90 MB内存中被清除。在垃圾收集之后,它再次以20 MB开始并且增长超过120 MB。最后我得到了一个内存异常。

我个人认为我应该回收位图。但是当我在imageview上的setimagebitmap之后回收图像时,我得到错误:尝试使用回收的位图。

我不想使用图书馆因为我想知道我做错了什么

public class GalleryAdapter: PagerAdapter
{
    Context context; 
    List<ArticleImageVO> _data;

    public GalleryAdapter (Context context)
    {
        this.context = context;
        _data = new List<ArticleImageVO> ();
    }

    public override Java.Lang.Object InstantiateItem (Android.Views.ViewGroup container, int position)
    {
        ImageView imageView = new ImageView(context);
        imageView.SetScaleType(ImageView.ScaleType.CenterCrop);
        imageView.SetData (_data [position]);
        ((ViewPager) container).AddView(imageView, 0);
        return imageView;
    }

    public override bool IsViewFromObject (Android.Views.View view, Java.Lang.Object @object)
    {
        return view == ((ImageView) @object);
    }

    public override void DestroyItem (Android.Views.ViewGroup container, int position, Java.Lang.Object @object)
    {
        BitmapDrawable bitmapDrawable = (BitmapDrawable)((ImageView)@object).Drawable;
        if (bitmapDrawable != null && bitmapDrawable.Bitmap != null)
        {
            Bitmap bitmap = bitmapDrawable.Bitmap;
            bitmap.Recycle ();
        }
        ((ViewPager) container).RemoveView(((ImageView)@object) );
    }


    public override int Count 
    {
        get 
        {
            return _data.Count;
        }
    }

    public void SetData(List<ArticleImageVO> data)
    {
        _data.Clear ();
        _data.AddRange (data);
    }

}

viewpager中包含上述图库viewpager的适配器:

public class ArticleDetailAdapter: FragmentStatePagerAdapter
{
    NewsController _newsController = NewsController.Instance;

    public ArticleDetailAdapter (FragmentManager fm) : base (fm)
    {
    }


    public override Fragment GetItem (int position)
    {
        ArticleDetailFragment fragment = new ArticleDetailFragment ();
        fragment.SetArguments(_newsController.ArticlesList[position]);
        return fragment;
    }

    public override int Count 
    {
        get 
        {
            return _newsController.ArticlesList.Count;
        }
    }
}

上面ViewPagerAdapter中的片段:

0 个答案:

没有答案