android - Android Recyclerview 很慢
问题描述
我的回收站视图具有复杂的逻辑。让我指出他们,
- 视图持有者 UI 很复杂。
- 在每 5 个视图持有者之后加载横幅广告。
我的数据来自网络,我一直在使用 Room + Retrofit + Paging 适配器。
用户体验非常差。我需要一些建议。我相信有两件事会影响我的滚动功能。
- xml ui 膨胀。
- 在 UI 线程中加载 admob 广告。(他们希望我们在 ui 线程中执行此操作。我仍然不知道他们为什么要做这些疯狂的事情。)
我需要一些建议如何改进并提供良好的用户体验。
解决方案
由于没有源代码,我无法尝试评估其确切原因。但我以前经历过这样的事情,我有一些可能的解决方案给你。
1) 将长时间运行的任务从 UI 线程中移开:
我注意到您的数据来自 Room + Retrofit。默认情况下,Room 必须以异步方式运行,除非allowMainThreadQueries()
被调用。如果您确实调用了allowMainThreadQueries()
,如果您不小心尝试在 UI 线程上获取数据,您可以检查您的代码。
2) 您是否正确实施了 RecyclerView (RV)?
RV 尽可能减少 xml 膨胀量,并通过对相同视图类型重用膨胀布局来提高性能。因此,如果您只有 2 种视图类型,如您的问题所示,RV 只会膨胀 3-6 个布局(即使您的列表中有 100 个项目)并将其附加到 ViewHolder,然后使用绑定和回收视图滚动列表时的项目。但是,如果实施不当,RV 可能会表现不佳。我之前遇到的一个例子是在 RV 适配器中将位置作为视图类型返回。
public class SampleAdapter extends RecyclerView.Adapter<RVItem.ViewHolder> {
private final List<Item> items = new ArrayList<>();
@Override
public int getItemViewType(int position) {
return position; //Never do this
return items.get(position).getType(); //Do this
}
}
因此,您可以尝试检查 RV 是否有任何实现/逻辑错误。
3) 在 Android Studio 中使用 Profiler
如果以上建议都不能解决问题。我能想到的最后一种方法是使用 Profiler 记录跟踪,同时您滚动浏览 RV 并尝试通过分析跟踪来识别哪个调用是耗时/阻塞的。更多信息:https ://developer.android.com/studio/profile/android-profiler
附加信息
最后,我想知道你在 UI 线程中加载 AdMob 广告是什么意思吗?据我所知,AdMob 像UnifiedNativeAd
. 只有这样你才尝试使用来自UnifiedNativeAd
UI 线程的数据来膨胀和设置你的视图,这并不是真正的 UI 阻塞任务
推荐阅读
- reactjs - 非材质ui组件中明暗主题切换
- python - 为什么图形窗口打不开?
- glsl - 优化片段着色器上的复杂 Mobius 变换
- ansible - 如何在ansible主机中以root用户身份执行命令
- charts - 在 pinescript 中获取主图表系列的会话时间(开始和结束时间)
- java - 删除后列表不更新
- java - 为什么我收到复制的 zip 的错误“找不到中央目录的开始”
- ios - 如何将mlmultiarray更改为字符串
- javascript - 如何使用 javascript 创建两个不同的链接
- javascript - 如何使用 CSS3 或 JavaScript 获得填充效果