NotifyDataSetChanged- RecyclerView - 这是一个异步调用吗?

Vai*_*rma 9 android asynchronous notifydatasetchanged android-recyclerview

notifyDataSetChanged在reinlerview上执行后尝试遵循一组语句.但是当我调试我的应用程序时,调试器notifyDataSetChanged在转到onBindViewHolderrecyclerview的适配器之后到达接下来的几行.所以我的问题是 - notifyDataSetChanged是异步调用吗?如果是,我们会收到回电吗?PS:我已经搜索了这个答案,我找不到合适的答案,这就是我向社区提问的原因.

yig*_*git 24

RecyclerView的作者在这里,

当您调用时notifyDataSetChanged,RecyclerView会使数据无效,但在下一个动画帧之前不会更新UI.这就是android视图系统的工作原理.当窗口小部件无效(例如,更改其数据)时,它会请求布局,这意味着它将在下一个视图遍历中重新测量并重新布局.这样做是为了我们可以批量所有更改,直到下一次更新屏幕.这就是为什么notifyDataSetChangeonBind立即触发.

所以,是的,您可以将其称为异步调用,但这并不意味着您可以多线程运行它(这是两个完全不同的概念).您仍然必须在主线程上对适配器进行所有更改.当您更改适配器时,您必须立即通知RecyclerView,这就是为什么通知也必须在主线程上.

这种限制的原因是如果在布局期间更改了数据集,布局管理器很难恢复到稳定状态(例如,想象RecyclerView调用onBind(5)和项目5同时在另一个线程中被删除).此外,考虑到这些变化将需要大量的同步,这将是一个很大的性能损失而没有任何好处.这就是所有UI组件都是单线程的原因.