我有一个包含五个Fragment
的ViewPager
。每个片段包含许多数据。例如,第一个片段是包含文本和图像的600个条目的列表。其他四个Fragment
包含从600个值的列表中创建求值的图。我实现的优化是:
- 适配器内没有数据库选择
- 适配器内没有图像加载(我使用Picasso)
- 适配器内部没有数据分析
我还在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
的机制,这是不可能的?
是的,可以将代码放置在AsyncTask中的onBincViewHolder中。您没有提供太多代码,我只能建议将您的UI逻辑和数据处理逻辑分离,然后将数据处理逻辑执行到工作线程中,同时向用户显示进度对话框,以通知后台中发生了一些事情
有时,当您确实有大量的数据,并且必须对它们进行一些繁重的处理时,对象的lazy loading
是一种更好的方法。由于您没有提供太多代码,我只能建议将您的UI logic
和data processing logic
分离,然后将data processing logic
执行到一个工作线程中,同时向用户显示进度对话框,以通知后台发生了一些事情。这样可以避免UI冻结带来的挫败感。
另一种方法可以是分段加载数据,并使用像notifyItemRangeInserted()
这样的方法,这些方法比简单的notifyDataSetChanged()
更有效。