微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

imageviews 列表的内存效率是多少

如何解决imageviews 列表的内存效率是多少

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

dynamically add and remove view to viewpager

现在假设我有 1000 个图像视图或视频视图或混合的列表/可观察集合。这种方法的内存效率是多少?这是一种不好的做法吗?

例如 我有一个 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);

实例化项目方法

    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次观看或100000次观看,你应该考虑问题吗?如果收到内存警告,系统将终止该应用程序。

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

它具有灵活的架构,可让您通过以下方式修改其行为 插入您喜欢的组件。

它对大型集合很有效,因为它重用项目视图 并且需要使用视图持有者来缓存视图引用。

默认情况下,RecyclerView 将重用视图,您不需要在运行时创建这么多视图。

我遇到了一些运行时视图删除和更新问题,例如 findviewwithtag 返回 null 而不是视图未被删除 正确

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。