【问题标题】:Android Databinding : ConcurrentModificationException while using ternary operator in method parameterAndroid数据绑定:在方法参数中使用三元运算符时出现ConcurrentModificationException
【发布时间】:2018-01-07 01:31:46
【问题描述】:

我在布局文件中使用数据绑定。以下是相关代码sn-p:

        <ImageButton
            android:id="@+id/btn_cross"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_close_white"
            app:onClick="@{(v) -> gameManager.dismissAndDestroyDialog()}"
            app:tapEvent="@{(v) -> eventUtils.sendEvent(viewModel.state == State.IN_PROGRESS ? Source.GAME_LOADING : Source.GAME_LOADING_ERROR)}"/>

viewModel:这是此布局的视图模型。
tapEvent:我用于绑定适配器。
Source:枚举类 State : 一个枚举类

当我执行这个时,我得到以下异常:

e: error: cannot generate view binders java.util.ConcurrentModificationException
e: 

e:      at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)
e:      at java.util.HashMap$ValueIterator.next(HashMap.java:1466)
e:      at android.databinding.tool.expr.CallbackExprModel.seal(CallbackExprModel.java:63)
e:      at android.databinding.tool.expr.LambdaExpr.setup(LambdaExpr.java:154)
e:      at android.databinding.tool.Binding.resolveCallbackParams(Binding.java:93)
e:      at android.databinding.tool.BindingTarget.resolveCallbackParams(BindingTarget.java:175)
e:      at android.databinding.tool.LayoutBinder.<init>(LayoutBinder.java:237)
e:      at android.databinding.tool.DataBinder.<init>(DataBinder.java:52)
e:      at android.databinding.tool.CompilerChef.ensureDataBinder(CompilerChef.java:88)
e:      at android.databinding.tool.CompilerChef.sealModels(CompilerChef.java:187)
e:      at android.databinding.annotationprocessor.ProcessExpressions.writeResourceBundle(ProcessExpressions.java:184)

如果您需要更多详细信息,请发表评论。我也用字符串参数在不同的 xml 文件中尝试过这个。没有什么对我有用。这是一个已知的错误吗?如果是这样,是否有任何解决方法?

注意:eventUtils 类是用 Kotlin 编写的,但我不认为这是一个问题。

编辑:viewModel.state 是 State 枚举数据类型的 Observable 字段。

【问题讨论】:

    标签: java android data-binding


    【解决方案1】:

    由于viewModel.stateObservable 字段,请使用此字段:

    app:tapEvent="@{(v) -> eventUtils.sendEvent(viewModel.state.get() == State.IN_PROGRESS ? Source.GAME_LOADING : Source.GAME_LOADING_ERROR)}"
    

    get() 方法必须在 lambda 内部使用。

    【讨论】:

      猜你喜欢
      • 2018-10-18
      • 1970-01-01
      • 2017-03-24
      • 2011-09-24
      • 2018-12-12
      • 1970-01-01
      • 2013-07-14
      • 2016-11-19
      • 2021-06-25
      相关资源
      最近更新 更多