今天循例升级了Android Studio3.6和Gradle3.6.0,一如既往的,发生了升级带来的各种问题,特别是这还是一个大版本升级。结果更新好之后编译就出现了下面的问题
e: error: cannot generate view binders java.lang.StackOverflowError
at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:209)
at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:211)
at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:211)
at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:211)
at android.databinding.tool.expr.Expr.resolveListeners(Expr.java:211)
Google之,发现官方的AS3.6beta2升级说明文档里也提及了这个问题
WX20200229-105748.png点击问题链接之后看到11楼的描述有了点问题发生的指引,发现链接里面描述的问题跟我一模一样,而我之前确实也在xml里使用过obs.get()/livedata.getValue()方法,随后用AS的查找功能给一一去掉后就没有这个问题发生了
WX20200229-105905.pngWX20200229-105921.png
然而像这种大特性的更新带来的问题肯定不止一个,接下来编译出现各种类型转换的问题和找不到方法的问题,其实都可以总结就是ViewBinding引入后调整了编译生成的各个Binding类所产生的问题
企业微信截图_d2675c61-e56c-4dda-ad3b-7b3ec5d7c0db.png这里的错误列表列出来的问题无外乎两种
1.类型转换错误
2.找不到方法
其中错误2找不到方法,很大原因其实是因为错误1类型转换出错引申的问题,只要解决错误1就会随之解决错误2
下面是解决问题的具体思路,不想看的可以直接看最后一段的高亮总结
类型转换错误具体错误提示为
[package]/databinding/HeaderProductBinding.java:171: 错误: 不兼容的类型: ItemMagazineSimpleProductBinding无法转换为ViewDataBinding
点击跳转到这个错误的具体位置
setContainedBinding(this.frameSimpleProducts);
是一个很简单的set方法
/**
* Used internally to set the containing binding for an included binding to this.
*
* @hide
*/
protected void setContainedBinding(ViewDataBinding included) {
if (included != null) {
included.mContainingBinding = this;
}
}
从这个方法的具体实现和参数命名可以具体猜测到是xml里include的layout出现了问题,查看xml后发现果不其然,有这么一行代码
<include
android:id="@+id/frame_simple_products"
layout="@layout/item_magazine_simple_product" />
“frame_simple_products”这个id正好对上setContainedBinding(this.frameSimpleProducts);这个报错方法的参数名,而as编译出错的提示语“不兼容的类型: ItemMagazineSimpleProductBinding无法转换为ViewDataBinding”里的“ItemMagazineSimpleProductBinding”也正正是include的这个layout生成的Binding类。
也就是说这个被include的layout生成的Binding类不是ViewDataBinding类,而查看报错的HeaderProductBinding类发现现在凡是实现了DataBinding的xml生成的实现类都是继承自ViewDataBinding,亦即是说实现了DataBinding的xml其include的layout也需要实现DataBinding,手动把所有被include的layout转换成DB即可
问题解决,编译通过!
网友评论