【问题标题】:How much memory efficient is list of imageviews图像视图列表的内存效率是多少
【发布时间】:2021-01-11 17:54:50
【问题描述】:

我正在尝试在 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)
        {
        }
    }

再次!在代码中保留所有视图的列表然后引用该列表中的视图是一种不好的方法吗?

【问题讨论】:

  • 我会说将所有这些数据(即您的记忆)保存在您的集合中是一种不好的做法,更好的做法是根据要求加载数据,例如 FB 和 Instagram 如何加载他们的视图。仅在需要它们并且不在插槽中时才在一起

标签: android list xamarin.android android-viewpager observablecollection


【解决方案1】:

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

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

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

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

RecyclerView 默认会重用视图,你不需要在运行时创建这么多视图。

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复马丁。但我的问题是有区别的,因为我保留了一份意见清单。我更新了我的问题以便更好地理解。
    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2016-07-06
    相关资源
    最近更新 更多