图像视图列表的内存效率是多少

How much memory efficient is list of imageviews

我正在尝试在 xamarin.android 中制作图像视频滑块,我遇到了一些运行时视图删除和更新问题,例如 findviewwithtag 返回 null 而不是视图未被正确删除,因此在搜索互联网后我明白了从这个线程的答案中列出所有视图

dynamically add and remove view to viewpager

现在假设我有 1000 list/observablecollection 图像视图或视频视图或混合。这种方法的内存效率是多少?这是一种不好的做法吗?

例如 我有一个列表 java.lang.object

 private ObservableCollection<Java.Lang.Object> _views = new ObservableCollection<Java.Lang.Object>();

每次在列表中添加新的动态项时都会调用此代码

        View view = new View(_context);
        if (con.MediaType.ToLower().Contains(Common.TYPE_IMAGE)) 
         //MediaType.Image
        {
            view = new ImageView(_context);

            ((Activity)_context).RunOnUiThread(() =>
            {
                SetScaleType(ref view, con.ScaleType);
                try
                {
                    //implement ifileprovider
                    ((ImageView)view).SetImageURI(Uri.Parse(con.LocalPath));
                }
                catch (Exception ex)
                {
                }
            });
        }
        _views.add(view);

实例化item方法

    public override Object InstantiateItem(ViewGroup container, int position)
    {
        try
        {
            ((Activity)_context).RunOnUiThread(() =>
            {
                container.AddView((View)_views[position], 0);
                if (position == 0)
                {
                    OnPageSelected(0);
                }
            });
        }
        catch (Exception ex)
        {

        }
        return _views[position];
    }

销毁物品的方法

    public override void DestroyItem(ViewGroup container, int position, 
    Object @object)
    {
        try
        {
            ((Activity)_context).RunOnUiThread(() =>
            {
                View view = (View)@object;
                ((ViewPager)container).RemoveView(view);
                view = null;
                GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
            });
        }
        catch (Exception ex)
        {
        }
    }

又来了!在代码中保留所有视图的列表然后从该列表中引用视图是一种糟糕的方法吗?

ViewPager & RecyclerView 仅实例化视口中的项目。

将所有视图保存在 ObservableCollection 中是一种糟糕的方法。 10000次浏览量还是1000000次浏览量你应该思考一下问题?如果收到内存警告,系统将终止该应用程序。

来自 RecyclerView document,RecyclerView 提供了两个引人注目的功能::

It has a flexible architecture that lets you modify its behavior by plugging in your preferred components.

It is efficient with large collections because it reuses item views and requires the use of view holders to cache view references.

RecyclerView默认会复用视图,你不需要在运行的时候创建那么多视图。

I was having some runtime view deletion and updation issues like findviewwithtag returning null and not view not getting deleted properly

正确的方法是在需要时加载视图,而不是同时加载它们。在 ObservableCollection 中添加 Views 的数据,并修改列表中的数据而不是 find/modify views。更改数据后,再刷新RecycleView。

比如要移除一个视图,可以移除ObservableCollection中对应的数据,然后刷新RecycleView,对应的视图也会被移除。