在写RecyclerView的时候,内部类的ViewHolder使用了以下写法:
class ViewHolder(val itemView: View): RecyclerView.ViewHolder(itemView) {
...
}
然后在onBindViewHolder中使用了一个方法:
private fun f(holder: ViewHolder, position: Int) {
...
val layoutParams = holder.itemView.layoutParams
...
}
然后在val layoutParams = holder.itemView.layoutParams 这里发生了Crash,报错信息为:
ava.lang.IllegalAccessError,说我的ViewHolder.itemView对我的Adapter是inaccessible的。
这个Crash并不是必现的,甚至可以说只有在非常少的机型会出现。线上没有任何崩溃日志与这个相关,但是被RD自测出来了。
这段逻辑看起来并没有任何问题,初始化内部类时设置了一个成员变量itemView,并且使用这个itemView初始化了他的父类RecyclerView.ViewHolder。
去掉val后,这个崩溃就不会复现了,所以初步怀疑是因为这个val的原因,在使用itemView的时候,实际上是使用了java代码中RecyclerView.ViewHolder的public final View itemView,这种Java和Kotlin代码混合使用的过程中,发生了这个Crash。