【问题标题】:Android lazy data binding possible?Android惰性数据绑定可能吗?
【发布时间】:2016-03-05 03:48:13
【问题描述】:

Android 数据绑定支持最酷的功能之一是它还为设置了 ID 的 View 生成字段。这会整理代码库,因为不需要任何字段或 findViewById() 调用。

但问题是绑定实例只能通过bind() 调用来检索,该调用倾向于安排绑定。当异步接收数据并且通常会抛出 NullPointerException 时,这很糟糕。

是否可以在减去实际数据绑定过程的情况下检索具有视图字段的绑定实例?

堆栈跟踪:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference
         at com.app.android.databinding.ActivityRestaurantDetailsBinding.executeBindings(ActivityRestaurantDetailsBinding.java:381)
         at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:350)
         at android.databinding.ViewDataBinding$6.run(ViewDataBinding.java:167)
         at android.databinding.ViewDataBinding$5.onViewAttachedToWindow(ViewDataBinding.java:137)
         at android.view.View.dispatchAttachedToWindow(View.java:14525)

【问题讨论】:

    标签: android lazy-initialization android-databinding


    【解决方案1】:

    这似乎没有意义,数据绑定将忽略空变量,因此不应抛出空指针,我相信这是它最受推崇的特性之一。如果您需要在异步调用等之后修改变量,您可以使用dataBinding.executePendingBindings()

    来自the docs

    生成的绑定类对于每个描述的变量都有一个 setter 和 getter。在调用 setter 之前,变量将采用默认的 Java 值——null 表示引用类型,0 表示 int,false 表示布尔值,等等。

    生成的数据绑定代码会自动检查空值并避免空指针异常。例如,在表达式@{user.name} 中,如果 user 为 null,则 user.name 将被赋予其默认值 (null)。如果你引用 user.age,其中 age 是一个 int,那么它会默认为 0。

    【讨论】:

    • 我也有同样的期望。检查生成的代码后,有许多空值检查,但对于这种布尔类型而言,情况并非如此。这听起来像一个错误吗?
    • android:text="@{DateFormatter.format(item.orderDate)}" 也一样。这会导致调用 DateFormatter.format(null) 的 NPE 原因。
    • 在过去几个月使用数据绑定之后,空值检查似乎仍然存在很多问题,这非常令人失望。正如@razzledazzle 所说,最突出的原因是布尔类型
    【解决方案2】:

    java.lang.Boolean 遇到了同样的问题。通过使用原始boolean 类型来解决。

    <variable
        name="var"
        type="boolean" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2010-11-03
      • 1970-01-01
      相关资源
      最近更新 更多