使用包含大量数据的RecyclerViews优化ViewPager

时间:2016-07-31 19:07:00

标签: android performance android-viewpager android-recyclerview

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

  1. 没有数据库在适配器内选择
  2. 没有图片在适配器内部加载(我正在使用Picasso)
  3. 适配器内部没有数据解析
  4. 我还在AsyncTask内加载了适配器的条目。对于RecyclerView,我设置了以下选项:

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

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

    this.viewPager.setOffscreenPageLimit(5);
    

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

    我如何进一步改善表现?是否可以将代码置于onBincViewHolder内的AsyncTask内,或者由于RecyclerView的机制而无法实现?

2 个答案:

答案 0 :(得分:3)

是的,可以将代码置于AsyncTask内的onBincViewHolder中。  你没有提供太多的代码,我只建议将你的UI逻辑和数据处理逻辑分开,然后将数据处理逻辑分成工作线程,同时向用户显示一个进度对话框,通知背景中发生的事情

答案 1 :(得分:1)

有时当你真的拥有大量数据并且需要对它们进行大量处理时,lazy loading对象是一种更好的方法。由于您没有提供太多代码,我只能建议您将UI logicdata processing logic分开,然后将data processing logic执行到工作线程中,同时向用户显示进度对话框以通知某些内容正在背景中发生。这样可以避免UI冻结的挫败感。

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