双向数据绑定如何导致无限循环?

时间:2019-04-07 12:41:21

标签: android android-databinding two-way-binding

我正在通过阅读官方的docs来学习数据绑定。一切都有希望的是,双向绑定中可能存在无限循环。根据{{​​3}}上的官方文档:

  

使用双向数据绑定时,请注意不要引入无限循环。当用户更改属性时,将调用使用@InverseBindingAdapter注释的方法,并将该值分配给backing属性。反过来,这将调用使用@BindingAdapter注释的方法,这将触发另一个使用@InverseBindingAdapter注释的方法的调用,依此类推。

我理解该语句的第一部分,即如果属性发生更改并且将新值分配给backing属性,则将调用用@InverseBindingAdapter进行注释的方法。

但是我不明白的是,为什么在此过程中调用@InverseBindingAdapter方法时又将@BindingAdapter方法称为 以及它如何导致无限循环?

>

2 个答案:

答案 0 :(得分:0)

迟到总比我猜想要晚:)发生无限循环的原因是InverseBindingAdapter基本上是变化的观察者。因此,当用户进行了某些更改时,InverseBindingAdapter中的onChanged观察者将被触发并执行一些逻辑。因此,BindingAdapter也会对字段中的更改做出反应并再次更新值,以便再次触发InverseBindingAdapter中的更改侦听器,而不是我们陷入循环。

所以这是一些视觉效果

  1. 用户->输入名称“ Joe”
  2. InverseBindingAdapter->由更新触发
  3. ObservableField / LiveData->也通过2种方式进行了更新,现在包含值“ Joe”
  4. 随着ObservableField / LiveData的更新,将触发BindingAdapter来将新值设置到文件中。
  5. InverseBindingAdapter->在该字段中检测到另一个更改并被触发。
  6. 重复执行步骤3、4、5。...

在高级DataBinding上检查我的article on Medium,它实际上通过ViewPager和2路绑定示例描述了这种情况。 (是的,无耻的自拔免责声明)

答案 1 :(得分:0)

可以通过在将新值设置为目标视图之前检查旧值和新值来解决此问题。

示例:

@BindingAdapter("android:text")
fun setText(editText: EditText, value: Int) {
    val newVal = if (value == 0) "" else value.toString()
    val oldVal = editText.text.toString()
    if (oldVal == newVal) {
        return
    }
    editText.setText(newVal)
    if (newVal.isNotEmpty()) {
        editText.setSelection(newVal.length)
    }
}