【问题标题】:Android Why use executePendingBindings in RecyclerViewAndroid 为什么在 RecyclerView 中使用 executePendingBindings
【发布时间】:2023-03-17 14:52:01
【问题描述】:

我最近一直在使用数据绑定,我遇到了executePendingBindings 方法。该文档几乎没有显示它,我无法理解它是如何工作的或何时使用它。

许多开发人员在 onBindViewHolder 回调中使用 executePendingBindings,但我自己在使用与不使用时在回收器中没有看到任何差异。

有人可以解释为什么在回收站中使用它很重要吗?谢谢

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {

            Customer customer= List.get(position).second;
            ((CustomerViewHolder)holder).binding.setCustomer (customer)

            ((CustomerViewHolder)holder).binding.executePendingBindings();


}

【问题讨论】:

标签: android android-recyclerview android-databinding


【解决方案1】:

对您的绑定进行一些更改并不意味着它会对您的View 产生立即影响。更改绑定中的内容意味着您确实计划在最近的将来应用这些更改。这有很多原因,性能就是其中之一。

想象一下,您的 xml 中有一些复杂的表达式。在设置所有绑定变量之前,您不想弄清楚与绑定变量相关的所有内容。那会浪费资源。

您可以在生成的绑定 java 类本身中看到更多关于它的信息。我建议你通读一遍。

调用executePendingBindings 意味着您实际上是在强制框架在调用它的那一刻完成它迄今为止在绑定上需要做的所有事情。

如果您的情况不需要,您不必必须在适配器中执行此操作。有些人这样做是为了确保在继续之前在项目上正确设置所有内容。所以例如没有像 onBind 在上一轮绑定执行之前再次被调用的情况......或类似的事情......


编辑 1:

另外...不要忘记调度执行更改(在最近的将来)是允许您从不同于UI 线程的线程在binding 上进行setVariables 的事情。因为设置变量不会触及View 本身。


编辑 2:

查看生成的 java 类的最简单方法是:

  1. 导航 -> 文件

  1. 以大写形式键入绑定文件的名称,后跟Binding(例如,如果您的布局是activity_main,则键入ActivityMainBinding

【讨论】:

  • 所以当不使用 executePendingBindings 时,设置绑定变量会立即设置它的值,但是它计划在不久的将来更新的视图对吗?
  • 是否有可能使用 executePendingBindings 设置的视图与未设置 executePendingBindings 的旧值设置重叠?因为它在没有 executePendingBindings 的情况下异步执行。
  • 不,因为“调度”并不是传统意义上的调度。这更像是“标记某些已更改的绑定”,而不是“在将来应用更改”。因此,当您调用executePendingBindings() 时,旧代码中的“标记”将被新更改覆盖,然后将被executePendingBindings 调用清除。所以在那次调用之后,不会有“标记”,因为它已经被处理了(executeBindings() 这是executePendingBindings() 的结果)。
  • 不,只有“当前”值将用于执行。所以只是“循环”发生时当前存在的那个。所以当: 1. setVariable(A); 2. ; 3.setVariable(B); 4. ; 5. 只有 B 将被评估和应用;
  • @Nick 我真的建议你看看生成的 java 类。它会为你消除很多困惑。
【解决方案2】:

还有一件事我应该提一下。当您致电executePendingBindings() 时,您的列表将不会像没有此呼叫那样顺畅。因为 executePendingBindings() 在 UI 线程中做事。所以想象一个包含 500 个元素的列表。然后,每次在 UI 中调用此方法时,您都会收到“应用程序可能在其主线程上做的工作过多”。

【讨论】:

  • 执行挂起的绑定与手动设置绑定值有何不同?
猜你喜欢
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
相关资源
最近更新 更多