我有一个ViewPager
,其中包含五个Fragment
。每个片段包含大量数据。例如,第一个片段是包含文本和图像的600个条目的列表。其他四个Fragment
包含从600个值列表中创建评估的图表。我实现的优化是:
我还在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
的机制而无法实现?
答案 0 :(得分:3)
是的,可以将代码置于AsyncTask内的onBincViewHolder中。 你没有提供太多的代码,我只建议将你的UI逻辑和数据处理逻辑分开,然后将数据处理逻辑分成工作线程,同时向用户显示一个进度对话框,通知背景中发生的事情
答案 1 :(得分:1)
有时当你真的拥有大量数据并且需要对它们进行大量处理时,lazy loading
对象是一种更好的方法。由于您没有提供太多代码,我只能建议您将UI logic
和data processing logic
分开,然后将data processing logic
执行到工作线程中,同时向用户显示进度对话框以通知某些内容正在背景中发生。这样可以避免UI冻结的挫败感。
其他方法可能是将数据分段加载并使用notifyItemRangeInserted()
等方法,这些方法比简单notifyDataSetChanged()
更有效。