【问题标题】:Optimize ViewPager with RecyclerViews containing heavy data使用包含大量数据的 RecyclerViews 优化 ViewPager
【发布时间】:2016-07-31 19:07:00
【问题描述】:

我有一个ViewPager,其中包含五个Fragment。每个 Fragment 包含大量数据。例如,第一个片段是包含文本和图像的 600 个条目的列表。其他四个Fragment 包含图表,这些图表正在从 600 个值的列表中创建评估。我实施的优化是:

  1. 适配器内没有数据库选择
  2. 适配器内没有图像加载(我使用毕加索)
  3. 适配器内部没有数据解析

我还在AsyncTask 中加载适配器的条目。对于RecyclerView,我设置了以下选项:

this.listRowParent.setItemViewCacheSize(5);
this.listRowParent.setDrawingCacheEnabled(true);
this.listRowParent.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
this.listRowParent.setHasFixedSize(true);

经过我的所有优化,滚动非常流畅。我遇到的问题是当片段变得可见时会发生什么。当我设置适配器的那一刻,用户界面开始冻结(在 100 到 300 帧之间跳过)。我试图解决它增加OffscreenPageLimit

this.viewPager.setOffscreenPageLimit(5);

但这有时会有所帮助。我猜适配器设置时的内部初始化在 ui 线程上执行了太多工作,但我不知道如何提高性能。我在适配器和onBindViewHolder 方法中执行的唯一操作是列表初始化中的比较。

如何进一步提高性能?例如,是否可以将代码放在onBincViewHolder 中的AsyncTask 中,或者由于RecyclerView 的机制而无法实现?

【问题讨论】:

    标签: android performance android-viewpager android-recyclerview


    【解决方案1】:

    是的,可以将代码放在 AsyncTask 中的 onBincViewHolder 中。 你没有提供太多代码,我只能建议将你的 UI 逻辑和数据处理逻辑分开,然后将数据处理逻辑执行到一个工作线程中,同时向用户显示一个进度对话框以通知后台发生了一些事情

    【讨论】:

      【解决方案2】:

      有时,当您确实拥有大量数据并且必须对它们进行大量处理时,lazy loading of object 是一种更好的方法。由于您没有提供太多代码,我只能建议将您的UI logicdata processing logic 分开,然后将data processing logic 执行到工作线程中,同时向用户显示一个进度对话框,以通知后台发生了一些事情。这将避免 UI 冻结的挫败感。

      其他方法可能是分段加载数据并使用notifyItemRangeInserted() 之类的方法,这些方法比简单的notifyDataSetChanged() 更有效。

      【讨论】:

      • 但这不是recyclerview应该做的吗?例如,这 600 个值是过去 3 个月的数据。如果我只获取上周的数据,那么一切都运行得又快又顺利。所以我认为设置this.listRowParent.setItemViewCacheSize(5); 可以解决问题。如果没有 - 是否有一种 recyclerview 技术可以自动处理“延迟加载”?
      猜你喜欢
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多